{
  "id": "0d21709d8cf2c4ecfe2d10552c5cb3ab",
  "_format": "hh-sol-build-info-1",
  "solcVersion": "0.6.12",
  "solcLongVersion": "0.6.12+commit.27d51765",
  "input": {
    "language": "Solidity",
    "sources": {
      "contracts/bentobox/KashiPairMediumRiskV1.sol": {
        "content": "// SPDX-License-Identifier: UNLICENSED\n// Kashi Lending Medium Risk\n\n//  __  __             __    __      _____                  __ __\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\n// |__|\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\n//                                                                     |_____|\n\n// Copyright (c) 2021 BoringCrypto - All rights reserved\n// Twitter: @Boring_Crypto\n\n// Special thanks to:\n// @0xKeno - for all his invaluable contributions\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\n\n// Version: 22-Feb-2021\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\n// solhint-disable avoid-low-level-calls\n// solhint-disable no-inline-assembly\n// solhint-disable not-rely-on-time\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\n// License-Identifier: MIT\n\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\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/Domain.sol@v1.2.0\n// License-Identifier: MIT\n// Based on code and smartness by Ross Campbell and Keno\n// Uses immutable to store the domain separator to reduce gas usage\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\n\ncontract Domain {\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\"EIP712Domain(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\n    // solhint-disable var-name-mixedcase\n    bytes32 private immutable _DOMAIN_SEPARATOR;\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\n\n    /// @dev Calculate the DOMAIN_SEPARATOR\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\n    }\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    /// @dev Return the DOMAIN_SEPARATOR\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\n    }\n}\n\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\n// License-Identifier: MIT\n\n// solhint-disable no-inline-assembly\n// solhint-disable not-rely-on-time\n\n// Data part taken out for building of contracts that receive delegate calls\ncontract ERC20Data {\n    /// @notice owner > balance mapping.\n    mapping(address => uint256) public balanceOf;\n    /// @notice owner > spender > allowance mapping.\n    mapping(address => mapping(address => uint256)) public allowance;\n    /// @notice owner > nonce mapping. Used in `permit`.\n    mapping(address => uint256) public nonces;\n}\n\ncontract ERC20 is ERC20Data, Domain {\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 Transfers `amount` tokens from `msg.sender` to `to`.\n    /// @param to The address to move the tokens.\n    /// @param amount of the tokens to move.\n    /// @return (bool) Returns True if succeeded.\n    function transfer(address to, uint256 amount) public returns (bool) {\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\n        if (amount != 0) {\n            uint256 srcBalance = balanceOf[msg.sender];\n            require(srcBalance >= amount, \"ERC20: balance too low\");\n            if (msg.sender != to) {\n                require(to != address(0), \"ERC20: no zero address\"); // Moved down so low balance calls safe some gas\n\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\n            }\n        }\n        emit Transfer(msg.sender, to, amount);\n        return true;\n    }\n\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\n    /// @param from Address to draw tokens from.\n    /// @param to The address to move the tokens.\n    /// @param amount The token amount to move.\n    /// @return (bool) Returns True if succeeded.\n    function transferFrom(\n        address from,\n        address to,\n        uint256 amount\n    ) public returns (bool) {\n        // If `amount` is 0, or `from` is `to` nothing happens\n        if (amount != 0) {\n            uint256 srcBalance = balanceOf[from];\n            require(srcBalance >= amount, \"ERC20: balance too low\");\n\n            if (from != to) {\n                uint256 spenderAllowance = allowance[from][msg.sender];\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\n                if (spenderAllowance != type(uint256).max) {\n                    require(spenderAllowance >= amount, \"ERC20: allowance too low\");\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\n                }\n                require(to != address(0), \"ERC20: no zero address\"); // Moved down so other failed calls safe some gas\n\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\n            }\n        }\n        emit Transfer(from, to, amount);\n        return true;\n    }\n\n    /// @notice Approves `amount` from sender to be spend by `spender`.\n    /// @param spender Address of the party that can draw from msg.sender's account.\n    /// @param amount The maximum collective amount that `spender` can draw.\n    /// @return (bool) Returns True if approved.\n    function approve(address spender, uint256 amount) public returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        emit Approval(msg.sender, spender, amount);\n        return true;\n    }\n\n    // keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\n    /// @param owner_ Address of the owner.\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\n    /// @param value The maximum collective amount that `spender` can draw.\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\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        require(owner_ != address(0), \"ERC20: Owner cannot be 0\");\n        require(block.timestamp < deadline, \"ERC20: Expired\");\n        require(\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\n                owner_,\n            \"ERC20: Invalid Signature\"\n        );\n        allowance[owner_][spender] = value;\n        emit Approval(owner_, spender, value);\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/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\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\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\n        if (data.length >= 64) {\n            return abi.decode(data, (string));\n        } else if (data.length == 32) {\n            uint8 i = 0;\n            while (i < 32 && data[i] != 0) {\n                i++;\n            }\n            bytes memory bytesArray = new bytes(i);\n            for (i = 0; i < 32 && data[i] != 0; i++) {\n                bytesArray[i] = data[i];\n            }\n            return string(bytesArray);\n        } else {\n            return \"???\";\n        }\n    }\n\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\n    /// @param token The address of the ERC-20 token contract.\n    /// @return (string) Token symbol.\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\n        return success ? returnDataToString(data) : \"???\";\n    }\n\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\n    /// @param token The address of the ERC-20 token contract.\n    /// @return (string) Token name.\n    function safeName(IERC20 token) internal view returns (string memory) {\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\n        return success ? returnDataToString(data) : \"???\";\n    }\n\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\n    /// @param token The address of the ERC-20 token contract.\n    /// @return (uint8) Token decimals.\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\n    }\n}\n\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\n// License-Identifier: MIT\n\ninterface IBatchFlashBorrower {\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\n// License-Identifier: MIT\n\ninterface IFlashBorrower {\n    function onFlashLoan(\n        address sender,\n        IERC20 token,\n        uint256 amount,\n        uint256 fee,\n        bytes calldata data\n    ) external;\n}\n\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\n// License-Identifier: MIT\n\ninterface IStrategy {\n    // Send the assets to the Strategy and call skim to invest them\n    function skim(uint256 amount) external;\n\n    // Harvest any profits made converted to the asset and pass them to the caller\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\n\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\n    // 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.\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\n\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\n    function exit(uint256 balance) external returns (int256 amountAdded);\n}\n\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\n// License-Identifier: MIT\n\ninterface IBentoBoxV1 {\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\n    event LogRegisterProtocol(address indexed protocol);\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\n    event LogStrategyDivest(address indexed token, uint256 amount);\n    event LogStrategyInvest(address indexed token, uint256 amount);\n    event LogStrategyLoss(address indexed token, uint256 amount);\n    event LogStrategyProfit(address indexed token, uint256 amount);\n    event LogStrategyQueued(address indexed token, address indexed strategy);\n    event LogStrategySet(address indexed token, address indexed strategy);\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    function balanceOf(IERC20, address) external view returns (uint256);\n\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\n\n    function batchFlashLoan(\n        IBatchFlashBorrower borrower,\n        address[] calldata receivers,\n        IERC20[] calldata tokens,\n        uint256[] calldata amounts,\n        bytes calldata data\n    ) external;\n\n    function claimOwnership() external;\n\n    function deploy(\n        address masterContract,\n        bytes calldata data,\n        bool useCreate2\n    ) external payable;\n\n    function deposit(\n        IERC20 token_,\n        address from,\n        address to,\n        uint256 amount,\n        uint256 share\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\n\n    function flashLoan(\n        IFlashBorrower borrower,\n        address receiver,\n        IERC20 token,\n        uint256 amount,\n        bytes calldata data\n    ) external;\n\n    function harvest(\n        IERC20 token,\n        bool balance,\n        uint256 maxChangeAmount\n    ) external;\n\n    function masterContractApproved(address, address) external view returns (bool);\n\n    function masterContractOf(address) external view returns (address);\n\n    function nonces(address) external view returns (uint256);\n\n    function owner() external view returns (address);\n\n    function pendingOwner() external view returns (address);\n\n    function pendingStrategy(IERC20) external view returns (IStrategy);\n\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    ) external;\n\n    function registerProtocol() external;\n\n    function setMasterContractApproval(\n        address user,\n        address masterContract,\n        bool approved,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\n\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\n\n    function strategy(IERC20) external view returns (IStrategy);\n\n    function strategyData(IERC20)\n        external\n        view\n        returns (\n            uint64 strategyStartDate,\n            uint64 targetPercentage,\n            uint128 balance\n        );\n\n    function toAmount(\n        IERC20 token,\n        uint256 share,\n        bool roundUp\n    ) external view returns (uint256 amount);\n\n    function toShare(\n        IERC20 token,\n        uint256 amount,\n        bool roundUp\n    ) external view returns (uint256 share);\n\n    function totals(IERC20) external view returns (Rebase memory totals_);\n\n    function transfer(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 share\n    ) external;\n\n    function transferMultiple(\n        IERC20 token,\n        address from,\n        address[] calldata tos,\n        uint256[] calldata shares\n    ) external;\n\n    function transferOwnership(\n        address newOwner,\n        bool direct,\n        bool renounce\n    ) external;\n\n    function whitelistMasterContract(address masterContract, bool approved) external;\n\n    function whitelistedMasterContracts(address) external view returns (bool);\n\n    function withdraw(\n        IERC20 token_,\n        address from,\n        address to,\n        uint256 amount,\n        uint256 share\n    ) external returns (uint256 amountOut, uint256 shareOut);\n}\n\n// File contracts/interfaces/IOracle.sol\n// License-Identifier: MIT\n\ninterface IOracle {\n    /// @notice Get the latest exchange rate.\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n    /// For example:\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n    /// @return success if no valid (recent) rate is available, return false else true.\n    /// @return rate The rate of the requested asset / pair / pool.\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\n\n    /// @notice Check the last exchange rate without any state changes.\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n    /// For example:\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n    /// @return success if no valid (recent) rate is available, return false else true.\n    /// @return rate The rate of the requested asset / pair / pool.\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\n\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n    /// For example:\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n    /// @return rate The rate of the requested asset / pair / pool.\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\n\n    /// @notice Returns a human readable (short) name about this oracle.\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n    /// For example:\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n    /// @return (string) A human readable symbol name about this oracle.\n    function symbol(bytes calldata data) external view returns (string memory);\n\n    /// @notice Returns a human readable name about this oracle.\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n    /// For example:\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n    /// @return (string) A human readable name about this oracle.\n    function name(bytes calldata data) external view returns (string memory);\n}\n\n// File contracts/interfaces/ISwapper.sol\n// License-Identifier: MIT\n\ninterface ISwapper {\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\n    /// Swaps it for at least 'amountToMin' of token 'to'.\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\n    function swap(\n        IERC20 fromToken,\n        IERC20 toToken,\n        address recipient,\n        uint256 shareToMin,\n        uint256 shareFrom\n    ) external returns (uint256 extraShare, uint256 shareReturned);\n\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\n    /// this should be less than or equal to amountFromMax.\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\n    function swapExact(\n        IERC20 fromToken,\n        IERC20 toToken,\n        address recipient,\n        address refundTo,\n        uint256 shareFromSupplied,\n        uint256 shareToExact\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\n}\n\n// File contracts/KashiPair.sol\n// License-Identifier: UNLICENSED\n// Kashi Lending Medium Risk\n\n/// @title KashiPair\n/// @dev This contract allows contract calls to any contract (except BentoBox)\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\n    using BoringMath for uint256;\n    using BoringMath128 for uint128;\n    using RebaseLibrary for Rebase;\n    using BoringERC20 for IERC20;\n\n    event LogExchangeRate(uint256 rate);\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\n    event LogFeeTo(address indexed newFeeTo);\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\n\n    // Immutables (for MasterContract and all clones)\n    IBentoBoxV1 public immutable bentoBox;\n    KashiPairMediumRiskV1 public immutable masterContract;\n\n    // MasterContract variables\n    address public feeTo;\n    mapping(ISwapper => bool) public swappers;\n\n    // Per clone variables\n    // Clone init settings\n    IERC20 public collateral;\n    IERC20 public asset;\n    IOracle public oracle;\n    bytes public oracleData;\n\n    // Total amounts\n    uint256 public totalCollateralShare; // Total collateral supplied\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\n\n    // User balances\n    mapping(address => uint256) public userCollateralShare;\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\n    mapping(address => uint256) public userBorrowPart;\n\n    /// @notice Exchange and interest rate tracking.\n    /// This is 'cached' here because calls to Oracles can be very expensive.\n    uint256 public exchangeRate;\n\n    struct AccrueInfo {\n        uint64 interestPerSecond;\n        uint64 lastAccrued;\n        uint128 feesEarnedFraction;\n    }\n\n    AccrueInfo public accrueInfo;\n\n    // ERC20 'variables'\n    function symbol() external view returns (string memory) {\n        return string(abi.encodePacked(\"km\", collateral.safeSymbol(), \"/\", asset.safeSymbol(), \"-\", oracle.symbol(oracleData)));\n    }\n\n    function name() external view returns (string memory) {\n        return string(abi.encodePacked(\"Kashi Medium Risk \", collateral.safeName(), \"/\", asset.safeName(), \"-\", oracle.name(oracleData)));\n    }\n\n    function decimals() external view returns (uint8) {\n        return asset.safeDecimals();\n    }\n\n    // totalSupply for ERC20 compatibility\n    function totalSupply() public view returns (uint256) {\n        return totalAsset.base;\n    }\n\n    // Settings for the Medium Risk KashiPair\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\n    uint256 private constant FULL_UTILIZATION = 1e18;\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\n    uint256 private constant FACTOR_PRECISION = 1e18;\n\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\n\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\n\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\n\n    // Fees\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\n\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\n    constructor(IBentoBoxV1 bentoBox_) public {\n        bentoBox = bentoBox_;\n        masterContract = this;\n        feeTo = msg.sender;\n    }\n\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\n    function init(bytes calldata data) public payable override {\n        require(address(collateral) == address(0), \"KashiPair: already initialized\");\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\n        require(address(collateral) != address(0), \"KashiPair: bad pair\");\n\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\n    }\n\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\n    function accrue() public {\n        AccrueInfo memory _accrueInfo = accrueInfo;\n        // Number of seconds since accrue was called\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\n        if (elapsedTime == 0) {\n            return;\n        }\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\n\n        Rebase memory _totalBorrow = totalBorrow;\n        if (_totalBorrow.base == 0) {\n            // If there are no borrows, reset the interest rate\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\n            }\n            accrueInfo = _accrueInfo;\n            return;\n        }\n\n        uint256 extraAmount = 0;\n        uint256 feeFraction = 0;\n        Rebase memory _totalAsset = totalAsset;\n\n        // Accrue interest\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\n\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\n        totalBorrow = _totalBorrow;\n\n        // Update interest rate\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\n\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\n            }\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\n            }\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\n        }\n\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\n        accrueInfo = _accrueInfo;\n    }\n\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\n    function _isSolvent(\n        address user,\n        bool open,\n        uint256 _exchangeRate\n    ) internal view returns (bool) {\n        // accrue must have already been called!\n        uint256 borrowPart = userBorrowPart[user];\n        if (borrowPart == 0) return true;\n        uint256 collateralShare = userCollateralShare[user];\n        if (collateralShare == 0) return false;\n\n        Rebase memory _totalBorrow = totalBorrow;\n\n        return\n            bentoBox.toAmount(\n                collateral,\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\n                ),\n                false\n            ) >=\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\n    }\n\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\n    modifier solvent() {\n        _;\n        require(_isSolvent(msg.sender, false, exchangeRate), \"KashiPair: user insolvent\");\n    }\n\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\n    /// @return updated True if `exchangeRate` was updated.\n    /// @return rate The new exchange rate.\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\n        (updated, rate) = oracle.get(oracleData);\n\n        if (updated) {\n            exchangeRate = rate;\n            emit LogExchangeRate(rate);\n        } else {\n            // Return the old rate if fetching wasn't successful\n            rate = exchangeRate;\n        }\n    }\n\n    /// @dev Helper function to move tokens.\n    /// @param token The ERC-20 token.\n    /// @param share The amount in shares to add.\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\n    /// Only used for accounting checks.\n    /// @param skim If True, only does a balance check on this contract.\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\n    function _addTokens(\n        IERC20 token,\n        uint256 share,\n        uint256 total,\n        bool skim\n    ) internal {\n        if (skim) {\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \"KashiPair: Skim too much\");\n        } else {\n            bentoBox.transfer(token, msg.sender, address(this), share);\n        }\n    }\n\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\n    /// @param to The receiver of the tokens.\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\n    /// @param share The amount of shares to add for `to`.\n    function addCollateral(\n        address to,\n        bool skim,\n        uint256 share\n    ) public {\n        userCollateralShare[to] = userCollateralShare[to].add(share);\n        uint256 oldTotalCollateralShare = totalCollateralShare;\n        totalCollateralShare = oldTotalCollateralShare.add(share);\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\n    }\n\n    /// @dev Concrete implementation of `removeCollateral`.\n    function _removeCollateral(address to, uint256 share) internal {\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\n        totalCollateralShare = totalCollateralShare.sub(share);\n        emit LogRemoveCollateral(msg.sender, to, share);\n        bentoBox.transfer(collateral, address(this), to, share);\n    }\n\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\n    /// @param to The receiver of the shares.\n    /// @param share Amount of shares to remove.\n    function removeCollateral(address to, uint256 share) public solvent {\n        // accrue must be called because we check solvency\n        accrue();\n        _removeCollateral(to, share);\n    }\n\n    /// @dev Concrete implementation of `addAsset`.\n    function _addAsset(\n        address to,\n        bool skim,\n        uint256 share\n    ) internal returns (uint256 fraction) {\n        Rebase memory _totalAsset = totalAsset;\n        uint256 totalAssetShare = _totalAsset.elastic;\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\n            return 0;\n        }\n        totalAsset = _totalAsset.add(share, fraction);\n        balanceOf[to] = balanceOf[to].add(fraction);\n        _addTokens(asset, share, totalAssetShare, skim);\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\n    }\n\n    /// @notice Adds assets to the lending pair.\n    /// @param to The address of the user to receive the assets.\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\n    /// @param share The amount of shares to add.\n    /// @return fraction Total fractions added.\n    function addAsset(\n        address to,\n        bool skim,\n        uint256 share\n    ) public returns (uint256 fraction) {\n        accrue();\n        fraction = _addAsset(to, skim, share);\n    }\n\n    /// @dev Concrete implementation of `removeAsset`.\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\n        Rebase memory _totalAsset = totalAsset;\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\n        share = fraction.mul(allShare) / _totalAsset.base;\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\n        require(_totalAsset.base >= 1000, \"Kashi: below minimum\");\n        totalAsset = _totalAsset;\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\n        bentoBox.transfer(asset, address(this), to, share);\n    }\n\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\n    /// @param to The user that receives the removed assets.\n    /// @param fraction The amount/fraction of assets held to remove.\n    /// @return share The amount of shares transferred to `to`.\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\n        accrue();\n        share = _removeAsset(to, fraction);\n    }\n\n    /// @dev Concrete implementation of `borrow`.\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\n\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\n\n        share = bentoBox.toShare(asset, amount, false);\n        Rebase memory _totalAsset = totalAsset;\n        require(_totalAsset.base >= 1000, \"Kashi: below minimum\");\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\n        totalAsset = _totalAsset;\n        bentoBox.transfer(asset, address(this), to, share);\n    }\n\n    /// @notice Sender borrows `amount` and transfers it to `to`.\n    /// @return part Total part of the debt held by borrowers.\n    /// @return share Total amount in shares borrowed.\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\n        accrue();\n        (part, share) = _borrow(to, amount);\n    }\n\n    /// @dev Concrete implementation of `repay`.\n    function _repay(\n        address to,\n        bool skim,\n        uint256 part\n    ) internal returns (uint256 amount) {\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\n\n        uint256 share = bentoBox.toShare(asset, amount, true);\n        uint128 totalShare = totalAsset.elastic;\n        _addTokens(asset, share, uint256(totalShare), skim);\n        totalAsset.elastic = totalShare.add(share.to128());\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\n    }\n\n    /// @notice Repays a loan.\n    /// @param to Address of the user this payment should go.\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\n    /// @param part The amount to repay. See `userBorrowPart`.\n    /// @return amount The total amount repayed.\n    function repay(\n        address to,\n        bool skim,\n        uint256 part\n    ) public returns (uint256 amount) {\n        accrue();\n        amount = _repay(to, skim, part);\n    }\n\n    // Functions that need accrue to be called\n    uint8 internal constant ACTION_ADD_ASSET = 1;\n    uint8 internal constant ACTION_REPAY = 2;\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\n    uint8 internal constant ACTION_BORROW = 5;\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\n    uint8 internal constant ACTION_ACCRUE = 8;\n\n    // Functions that don't need accrue to be called\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\n\n    // Function on BentoBox\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\n\n    // Any external call (except to BentoBox)\n    uint8 internal constant ACTION_CALL = 30;\n\n    int256 internal constant USE_VALUE1 = -1;\n    int256 internal constant USE_VALUE2 = -2;\n\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\n    function _num(\n        int256 inNum,\n        uint256 value1,\n        uint256 value2\n    ) internal pure returns (uint256 outNum) {\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\n    }\n\n    /// @dev Helper function for depositing into `bentoBox`.\n    function _bentoDeposit(\n        bytes memory data,\n        uint256 value,\n        uint256 value1,\n        uint256 value2\n    ) internal returns (uint256, uint256) {\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\n        share = int256(_num(share, value1, value2));\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\n    }\n\n    /// @dev Helper function to withdraw from the `bentoBox`.\n    function _bentoWithdraw(\n        bytes memory data,\n        uint256 value1,\n        uint256 value2\n    ) internal returns (uint256, uint256) {\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\n    }\n\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\n    /// This also means that calls made from this contract shall *not* be trusted.\n    function _call(\n        uint256 value,\n        bytes memory data,\n        uint256 value1,\n        uint256 value2\n    ) internal returns (bytes memory, uint8) {\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\n            abi.decode(data, (address, bytes, bool, bool, uint8));\n\n        if (useValue1 && !useValue2) {\n            callData = abi.encodePacked(callData, value1);\n        } else if (!useValue1 && useValue2) {\n            callData = abi.encodePacked(callData, value2);\n        } else if (useValue1 && useValue2) {\n            callData = abi.encodePacked(callData, value1, value2);\n        }\n\n        require(callee != address(bentoBox) && callee != address(this), \"KashiPair: can't call\");\n\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\n        require(success, \"KashiPair: call failed\");\n        return (returnData, returnValues);\n    }\n\n    struct CookStatus {\n        bool needsSolvencyCheck;\n        bool hasAccrued;\n    }\n\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\n    function cook(\n        uint8[] calldata actions,\n        uint256[] calldata values,\n        bytes[] calldata datas\n    ) external payable returns (uint256 value1, uint256 value2) {\n        CookStatus memory status;\n        for (uint256 i = 0; i < actions.length; i++) {\n            uint8 action = actions[i];\n            if (!status.hasAccrued && action < 10) {\n                accrue();\n                status.hasAccrued = true;\n            }\n            if (action == ACTION_ADD_COLLATERAL) {\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\n                addCollateral(to, skim, _num(share, value1, value2));\n            } else if (action == ACTION_ADD_ASSET) {\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\n            } else if (action == ACTION_REPAY) {\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\n                _repay(to, skim, _num(part, value1, value2));\n            } else if (action == ACTION_REMOVE_ASSET) {\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\n                _removeCollateral(to, _num(share, value1, value2));\n                status.needsSolvencyCheck = true;\n            } else if (action == ACTION_BORROW) {\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\n                status.needsSolvencyCheck = true;\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\n                (bool updated, uint256 rate) = updateExchangeRate();\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \"KashiPair: rate not ok\");\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\n            } else if (action == ACTION_BENTO_DEPOSIT) {\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\n            } else if (action == ACTION_BENTO_WITHDRAW) {\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\n            } else if (action == ACTION_BENTO_TRANSFER) {\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\n            } else if (action == ACTION_CALL) {\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\n\n                if (returnValues == 1) {\n                    (value1) = abi.decode(returnData, (uint256));\n                } else if (returnValues == 2) {\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\n                }\n            } else if (action == ACTION_GET_REPAY_SHARE) {\n                int256 part = abi.decode(datas[i], (int256));\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\n            } else if (action == ACTION_GET_REPAY_PART) {\n                int256 amount = abi.decode(datas[i], (int256));\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\n            }\n        }\n\n        if (status.needsSolvencyCheck) {\n            require(_isSolvent(msg.sender, false, exchangeRate), \"KashiPair: user insolvent\");\n        }\n    }\n\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\n    /// @param users An array of user addresses.\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\n    /// @param open True to perform a open liquidation else False.\n    function liquidate(\n        address[] calldata users,\n        uint256[] calldata maxBorrowParts,\n        address to,\n        ISwapper swapper,\n        bool open\n    ) public {\n        // Oracle can fail but we still need to allow liquidations\n        (, uint256 _exchangeRate) = updateExchangeRate();\n        accrue();\n\n        uint256 allCollateralShare;\n        uint256 allBorrowAmount;\n        uint256 allBorrowPart;\n        Rebase memory _totalBorrow = totalBorrow;\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\n        for (uint256 i = 0; i < users.length; i++) {\n            address user = users[i];\n            if (!_isSolvent(user, open, _exchangeRate)) {\n                uint256 borrowPart;\n                {\n                    uint256 availableBorrowPart = userBorrowPart[user];\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\n                }\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\n                uint256 collateralShare =\n                    bentoBoxTotals.toBase(\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\n                        false\n                    );\n\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\n\n                // Keep totals\n                allCollateralShare = allCollateralShare.add(collateralShare);\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\n                allBorrowPart = allBorrowPart.add(borrowPart);\n            }\n        }\n        require(allBorrowAmount != 0, \"KashiPair: all are solvent\");\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\n        totalBorrow = _totalBorrow;\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\n\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\n\n        if (!open) {\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\n            require(masterContract.swappers(swapper), \"KashiPair: Invalid swapper\");\n\n            // Swaps the users' collateral for the borrowed asset\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\n\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\n            // solhint-disable-next-line reentrancy\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\n        } else {\n            // Swap using a swapper freely chosen by the caller\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\n            if (swapper != ISwapper(0)) {\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\n            }\n\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\n        }\n    }\n\n    /// @notice Withdraws the fees accumulated.\n    function withdrawFees() public {\n        accrue();\n        address _feeTo = masterContract.feeTo();\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\n        accrueInfo.feesEarnedFraction = 0;\n\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\n    }\n\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\n    /// MasterContract Only Admin function.\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\n    /// @param enable True to enable the swapper. To disable use False.\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\n        swappers[swapper] = enable;\n    }\n\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\n    /// MasterContract Only Admin function.\n    /// @param newFeeTo The address of the receiver.\n    function setFeeTo(address newFeeTo) public onlyOwner {\n        feeTo = newFeeTo;\n        emit LogFeeTo(newFeeTo);\n    }\n}\n"
      }
    },
    "settings": {
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "outputSelection": {
        "*": {
          "*": [
            "abi",
            "evm.bytecode",
            "evm.deployedBytecode",
            "evm.methodIdentifiers",
            "metadata",
            "devdoc",
            "userdoc",
            "storageLayout",
            "evm.gasEstimates"
          ],
          "": [
            "ast"
          ]
        }
      },
      "metadata": {
        "useLiteralContent": true
      }
    }
  },
  "output": {
    "contracts": {
      "contracts/bentobox/KashiPairMediumRiskV1.sol": {
        "BoringERC20": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122072467fd5dce41ce1fd399b96a1253f2896b7ae95540073a06a2c6095795b22d164736f6c634300060c0033",
              "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 PUSH19 0x467FD5DCE41CE1FD399B96A1253F2896B7AE95 SLOAD STOP PUSH20 0xA06A2C6095795B22D164736F6C634300060C0033 ",
              "sourceMap": "16155:2326:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122072467fd5dce41ce1fd399b96a1253f2896b7ae95540073a06a2c6095795b22d164736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH19 0x467FD5DCE41CE1FD399B96A1253F2896B7AE95 SLOAD STOP PUSH20 0xA06A2C6095795B22D164736F6C634300060C0033 ",
              "sourceMap": "16155:2326:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "returnDataToString(bytes memory)": "infinite",
                "safeDecimals(contract IERC20)": "infinite",
                "safeName(contract IERC20)": "infinite",
                "safeSymbol(contract IERC20)": "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/bentobox/KashiPairMediumRiskV1.sol\":\"BoringERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "BoringMath": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220f15f4a935823fe5f284aff75ab5a043259644ed71722f73c7108c48b1670787564736f6c634300060c0033",
              "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 CALL 0x5F 0x4A SWAP4 PC 0x23 INVALID 0x5F 0x28 0x4A SELFDESTRUCT PUSH22 0xAB5A043259644ED71722F73C7108C48B167078756473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "1152:949:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220f15f4a935823fe5f284aff75ab5a043259644ed71722f73c7108c48b1670787564736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALL 0x5F 0x4A SWAP4 PC 0x23 INVALID 0x5F 0x28 0x4A SELFDESTRUCT PUSH22 0xAB5A043259644ED71722F73C7108C48B167078756473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "1152: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/bentobox/KashiPairMediumRiskV1.sol\":\"BoringMath\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"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": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220db053e65b925857af5211b61c5940a46880a7fc705eec60a647d5033e2bd594e64736f6c634300060c0033",
              "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 0xDB SDIV RETURNDATACOPY PUSH6 0xB925857AF521 SHL PUSH2 0xC594 EXP CHAINID DUP9 EXP PUSH32 0xC705EEC60A647D5033E2BD594E64736F6C634300060C00330000000000000000 ",
              "sourceMap": "2202:311:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220db053e65b925857af5211b61c5940a46880a7fc705eec60a647d5033e2bd594e64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDB SDIV RETURNDATACOPY PUSH6 0xB925857AF521 SHL PUSH2 0xC594 EXP CHAINID DUP9 EXP PUSH32 0xC705EEC60A647D5033E2BD594E64736F6C634300060C00330000000000000000 ",
              "sourceMap": "2202: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/bentobox/KashiPairMediumRiskV1.sol\":\"BoringMath128\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"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
          }
        },
        "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": "608060405234801561001057600080fd5b50600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36103778061005f6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c8063078dfbe7146100515780634e71e0c8146100665780638da5cb5b1461006e578063e30c39781461008c575b600080fd5b61006461005f36600461022e565b610094565b005b610064610183565b610076610210565b6040516100839190610283565b60405180910390f35b61007661021f565b6000546001600160a01b031633146100c75760405162461bcd60e51b81526004016100be906102c6565b60405180910390fd5b8115610162576001600160a01b0383161515806100e15750805b6100fd5760405162461bcd60e51b81526004016100be90610297565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561017e565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b6001546001600160a01b03163381146101ae5760405162461bcd60e51b81526004016100be906102fb565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6000546001600160a01b031681565b6001546001600160a01b031681565b600080600060608486031215610242578283fd5b83356001600160a01b0381168114610258578384fd5b9250602084013561026881610330565b9150604084013561027881610330565b809150509250925092565b6001600160a01b0391909116815260200190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b801515811461033e57600080fd5b5056fea2646970667358221220de640c93a1c45d4b892e480fa48d8e09e3ef4bd1895e40952c8fb9ea56e7077264736f6c634300060c0033",
              "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 0x377 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 0x22E JUMP JUMPDEST PUSH2 0x94 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH2 0x183 JUMP JUMPDEST PUSH2 0x76 PUSH2 0x210 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x76 PUSH2 0x21F JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xC7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x2C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x162 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0xE1 JUMPI POP DUP1 JUMPDEST PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x297 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x17E JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x1AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x2FB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x242 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x258 JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x268 DUP2 PUSH2 0x330 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x278 DUP2 PUSH2 0x330 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL 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 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDE PUSH5 0xC93A1C45D 0x4B DUP10 0x2E 0x48 0xF LOG4 DUP14 DUP15 MULMOD 0xE3 0xEF 0x4B 0xD1 DUP10 0x5E BLOCKHASH SWAP6 0x2C DUP16 0xB9 0xEA JUMP 0xE7 SMOD PUSH19 0x64736F6C634300060C00330000000000000000 ",
              "sourceMap": "2905:1862:0:-:0;;;3109:115;;;;;;;;;-1:-1:-1;3140:5:0;:18;;-1:-1:-1;;;;;;3140:18:0;3148:10;3140:18;;;;;3173:44;;3148:10;;3140:5;3173:44;;3140:5;;3173:44;2905:1862;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061004c5760003560e01c8063078dfbe7146100515780634e71e0c8146100665780638da5cb5b1461006e578063e30c39781461008c575b600080fd5b61006461005f36600461022e565b610094565b005b610064610183565b610076610210565b6040516100839190610283565b60405180910390f35b61007661021f565b6000546001600160a01b031633146100c75760405162461bcd60e51b81526004016100be906102c6565b60405180910390fd5b8115610162576001600160a01b0383161515806100e15750805b6100fd5760405162461bcd60e51b81526004016100be90610297565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561017e565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b6001546001600160a01b03163381146101ae5760405162461bcd60e51b81526004016100be906102fb565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6000546001600160a01b031681565b6001546001600160a01b031681565b600080600060608486031215610242578283fd5b83356001600160a01b0381168114610258578384fd5b9250602084013561026881610330565b9150604084013561027881610330565b809150509250925092565b6001600160a01b0391909116815260200190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b801515811461033e57600080fd5b5056fea2646970667358221220de640c93a1c45d4b892e480fa48d8e09e3ef4bd1895e40952c8fb9ea56e7077264736f6c634300060c0033",
              "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 0x22E JUMP JUMPDEST PUSH2 0x94 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH2 0x183 JUMP JUMPDEST PUSH2 0x76 PUSH2 0x210 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x283 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x76 PUSH2 0x21F JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xC7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x2C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x162 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0xE1 JUMPI POP DUP1 JUMPDEST PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x297 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x17E JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x1AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBE SWAP1 PUSH2 0x2FB JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x242 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x258 JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x268 DUP2 PUSH2 0x330 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x278 DUP2 PUSH2 0x330 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL 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 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xDE PUSH5 0xC93A1C45D 0x4B DUP10 0x2E 0x48 0xF LOG4 DUP14 DUP15 MULMOD 0xE3 0xEF 0x4B 0xD1 DUP10 0x5E BLOCKHASH SWAP6 0x2C DUP16 0xB9 0xEA JUMP 0xE7 SMOD PUSH19 0x64736F6C634300060C00330000000000000000 ",
              "sourceMap": "2905:1862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3683:489;;;;;;:::i;:::-;;:::i;:::-;;4251:330;;;:::i;2847:20::-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2873:27;;;:::i;3683:489::-;4705:5;;-1:-1:-1;;;;;4705:5:0;4691:10;:19;4683:64;;;;-1:-1:-1;;;4683:64:0;;;;;;;:::i;:::-;;;;;;;;;3817:6:::1;3813:353;;;-1:-1:-1::0;;;;;3869:22:0;::::1;::::0;::::1;::::0;:34:::1;;;3895:8;3869:34;3861:68;;;;-1:-1:-1::0;;;3861:68:0::1;;;;;;;:::i;:::-;3993:5;::::0;;3972:37:::1;::::0;-1:-1:-1;;;;;3972:37:0;;::::1;::::0;3993:5;::::1;::::0;3972:37:::1;::::0;::::1;4023:5;:16:::0;;-1:-1:-1;;;;;4023:16:0;::::1;-1:-1:-1::0;;;;;;4023:16:0;;::::1;;::::0;;;;4053:25;;;;::::1;::::0;;3813:353:::1;;;4132:12;:23:::0;;-1:-1:-1;;;;;;4132:23:0::1;-1:-1:-1::0;;;;;4132:23:0;::::1;;::::0;;3813:353:::1;3683:489:::0;;;:::o;4251:330::-;4318:12;;-1:-1:-1;;;;;4318:12:0;4367:10;:27;;4359:72;;;;-1:-1:-1;;;4359:72:0;;;;;;;:::i;:::-;4487:5;;;4466:42;;-1:-1:-1;;;;;4466:42:0;;;;4487:5;;;4466:42;;;4518:5;:21;;-1:-1:-1;;;;;4518:21:0;;;-1:-1:-1;;;;;;4518:21:0;;;;;;;4549:25;;;;;;;4251:330::o;2847:20::-;;;-1:-1:-1;;;;;2847:20:0;;:::o;2873:27::-;;;-1:-1:-1;;;;;2873:27:0;;:::o;273:479:-1:-;;;;405:2;393:9;384:7;380:23;376:32;373:2;;;-1:-1;;411:12;373:2;72:20;;-1:-1;;;;;3813:54;;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::-;-1:-1;;;;;3813:54;;;;830:37;;2018:2;2003:18;;1989:124::o;2120:416::-;2320:2;2334:47;;;1104:2;2305:18;;;3493:19;-1:-1;;;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": "177400",
                "executionCost": "22588",
                "totalCost": "199988"
              },
              "external": {
                "claimOwnership()": "45022",
                "owner()": "1092",
                "pendingOwner()": "1114",
                "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/bentobox/KashiPairMediumRiskV1.sol\":\"BoringOwnable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 202,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:BoringOwnable",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 204,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.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": "608060405234801561001057600080fd5b5060bf8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80638da5cb5b146037578063e30c3978146051575b600080fd5b603d6057565b604051604891906075565b60405180910390f35b603d6066565b6000546001600160a01b031681565b6001546001600160a01b031681565b6001600160a01b039190911681526020019056fea2646970667358221220e4187836b4fa3e6937ac8b2b8b983f9bfd54d95d1c16febfdec8571b0d6b823364736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0xBF 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 0x75 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3D PUSH1 0x66 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE4 XOR PUSH25 0x36B4FA3E6937AC8B2B8B983F9BFD54D95D1C16FEBFDEC8571B 0xD PUSH12 0x823364736F6C634300060C00 CALLER ",
              "sourceMap": "2814:89:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052348015600f57600080fd5b506004361060325760003560e01c80638da5cb5b146037578063e30c3978146051575b600080fd5b603d6057565b604051604891906075565b60405180910390f35b603d6066565b6000546001600160a01b031681565b6001546001600160a01b031681565b6001600160a01b039190911681526020019056fea2646970667358221220e4187836b4fa3e6937ac8b2b8b983f9bfd54d95d1c16febfdec8571b0d6b823364736f6c634300060c0033",
              "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 0x75 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3D PUSH1 0x66 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE4 XOR PUSH25 0x36B4FA3E6937AC8B2B8B983F9BFD54D95D1C16FEBFDEC8571B 0xD PUSH12 0x823364736F6C634300060C00 CALLER ",
              "sourceMap": "2814:89:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2847:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2873:27;;;:::i;2847:20::-;;;-1:-1:-1;;;;;2847:20:0;;:::o;2873:27::-;;;-1:-1:-1;;;;;2873:27:0;;:::o;125:222:-1:-;-1:-1;;;;;514:54;;;;76:37;;252:2;237:18;;223:124::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "38200",
                "executionCost": "87",
                "totalCost": "38287"
              },
              "external": {
                "owner()": "1048",
                "pendingOwner()": "1070"
              }
            },
            "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/bentobox/KashiPairMediumRiskV1.sol\":\"BoringOwnableData\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 202,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:BoringOwnableData",
                "label": "owner",
                "offset": 0,
                "slot": "0",
                "type": "t_address"
              },
              {
                "astId": 204,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.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
          }
        },
        "Domain": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "DOMAIN_SEPARATOR()": {
                "details": "Return the DOMAIN_SEPARATOR"
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60c060405234801561001057600080fd5b504660a081905261002081610029565b6080525061009c565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921882306040516020016100609392919061007d565b604051602081830303815290604052805190602001209050919050565b92835260208301919091526001600160a01b0316604082015260600190565b60805160a0516101606100bd600039806053525080608852506101606000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80633644e51514610030575b600080fd5b61003861004e565b6040516100459190610102565b60405180910390f35b6000467f0000000000000000000000000000000000000000000000000000000000000000811461008657610081816100ae565b6100a8565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921882306040516020016100e59392919061010b565b604051602081830303815290604052805190602001209050919050565b90815260200190565b92835260208301919091526001600160a01b031660408201526060019056fea2646970667358221220f2e0b9857d04037dcf4c5d15f774834ed1fdf109ac571665925e76e33db99eea64736f6c634300060c0033",
              "opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CHAINID PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH2 0x20 DUP2 PUSH2 0x29 JUMP JUMPDEST PUSH1 0x80 MSTORE POP PUSH2 0x9C JUMP JUMPDEST PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x60 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x7D 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 SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0x160 PUSH2 0xBD PUSH1 0x0 CODECOPY DUP1 PUSH1 0x53 MSTORE POP DUP1 PUSH1 0x88 MSTORE POP PUSH2 0x160 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 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3644E515 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38 PUSH2 0x4E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x45 SWAP2 SWAP1 PUSH2 0x102 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x86 JUMPI PUSH2 0x81 DUP2 PUSH2 0xAE JUMP JUMPDEST PUSH2 0xA8 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xE5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x10B 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 SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLCODE 0xE0 0xB9 DUP6 PUSH30 0x4037DCF4C5D15F774834ED1FDF109AC571665925E76E33DB99EEA64736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "5074:1653:0:-:0;;;5747:207;;;;;;;;;-1:-1:-1;5837:9:0;5911:35;;;;5885:62;5837:9;5885:25;:62::i;:::-;5865:82;;-1:-1:-1;5074:1653:0;;5556:185;5630:7;5155:68;5710:7;5727:4;5666:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5656:78;;;;;;5649:85;;5556:185;;;:::o;365:444:-1:-;196:37;;;712:2;697:18;;196:37;;;;-1:-1;;;;;1055:54;795:2;780:18;;76:37;548:2;533:18;;519:290::o;:::-;5074:1653:0;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "338": [
                  {
                    "length": 32,
                    "start": 136
                  }
                ],
                "340": [
                  {
                    "length": 32,
                    "start": 83
                  }
                ]
              },
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c80633644e51514610030575b600080fd5b61003861004e565b6040516100459190610102565b60405180910390f35b6000467f0000000000000000000000000000000000000000000000000000000000000000811461008657610081816100ae565b6100a8565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921882306040516020016100e59392919061010b565b604051602081830303815290604052805190602001209050919050565b90815260200190565b92835260208301919091526001600160a01b031660408201526060019056fea2646970667358221220f2e0b9857d04037dcf4c5d15f774834ed1fdf109ac571665925e76e33db99eea64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3644E515 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38 PUSH2 0x4E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x45 SWAP2 SWAP1 PUSH2 0x102 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x86 JUMPI PUSH2 0x81 DUP2 PUSH2 0xAE JUMP JUMPDEST PUSH2 0xA8 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xE5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x10B 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 SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CALLCODE 0xE0 0xB9 DUP6 PUSH30 0x4037DCF4C5D15F774834ED1FDF109AC571665925E76E33DB99EEA64736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "5074:1653:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6255:262;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;6304:7;6382:9;6428:25;6417:36;;:93;;6476:34;6502:7;6476:25;:34::i;:::-;6417:93;;;6456:17;6417:93;6410:100;;;6255:262;:::o;5556:185::-;5630:7;5155:68;5710:7;5727:4;5666:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5656:78;;;;;;5649:85;;5556:185;;;:::o;365:222:-1:-;196:37;;;492:2;477:18;;463:124::o;594:444::-;196:37;;;941:2;926:18;;196:37;;;;-1:-1;;;;;1284:54;1024:2;1009:18;;76:37;777:2;762:18;;748:290::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "70400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite"
              },
              "internal": {
                "_calculateDomainSeparator(uint256)": "infinite",
                "_getDigest(bytes32)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Return the DOMAIN_SEPARATOR\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"Domain\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ERC20": {
          "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": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "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": "",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "DOMAIN_SEPARATOR()": {
                "details": "Return the DOMAIN_SEPARATOR"
              },
              "approve(address,uint256)": {
                "params": {
                  "amount": "The maximum collective amount that `spender` can draw.",
                  "spender": "Address of the party that can draw from msg.sender's account."
                },
                "returns": {
                  "_0": "(bool) Returns True if approved."
                }
              },
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "params": {
                  "deadline": "This permit must be redeemed before this deadline (UTC timestamp in seconds).",
                  "owner_": "Address of the owner.",
                  "spender": "The address of the spender that gets approved to draw from `owner_`.",
                  "value": "The maximum collective amount that `spender` can draw."
                }
              },
              "transfer(address,uint256)": {
                "params": {
                  "amount": "of the tokens to move.",
                  "to": "The address to move the tokens."
                },
                "returns": {
                  "_0": "(bool) Returns True if succeeded."
                }
              },
              "transferFrom(address,address,uint256)": {
                "params": {
                  "amount": "The token amount to move.",
                  "from": "Address to draw tokens from.",
                  "to": "The address to move the tokens."
                },
                "returns": {
                  "_0": "(bool) Returns True if succeeded."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60c060405234801561001057600080fd5b504660a081905261002081610029565b6080525061009c565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921882306040516020016100609392919061007d565b604051602081830303815290604052805190602001209050919050565b92835260208301919091526001600160a01b0316604082015260600190565b60805160a051610a666100bf600039806103325250806103675250610a666000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637ecebe001161005b5780637ecebe00146100f1578063a9059cbb14610104578063d505accf14610117578063dd62ed3e1461012c57610088565b8063095ea7b31461008d57806323b872dd146100b65780633644e515146100c957806370a08231146100de575b600080fd5b6100a061009b3660046107f8565b61013f565b6040516100ad9190610866565b60405180910390f35b6100a06100c4366004610745565b6101aa565b6100d161032d565b6040516100ad9190610871565b6100d16100ec3660046106ef565b61038d565b6100d16100ff3660046106ef565b61039f565b6100a06101123660046107f8565b6103b1565b61012a610125366004610785565b61048e565b005b6100d161013a366004610711565b61062f565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610198908690610871565b60405180910390a35060015b92915050565b600081156102d8576001600160a01b038416600090815260208190526040902054828110156101f45760405162461bcd60e51b81526004016101eb906109b1565b60405180910390fd5b836001600160a01b0316856001600160a01b0316146102d6576001600160a01b03851660009081526001602090815260408083203384529091529020546000198114610283578381101561025a5760405162461bcd60e51b81526004016101eb9061091b565b6001600160a01b0386166000908152600160209081526040808320338452909152902084820390555b6001600160a01b0385166102a95760405162461bcd60e51b81526004016101eb906108eb565b506001600160a01b0380861660009081526020819052604080822086850390559186168152208054840190555b505b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161031b9190610871565b60405180910390a35060019392505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610365576103608161064c565b610387565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006020819052908152604090205481565b60026020526000908152604090205481565b6000811561044b5733600090815260208190526040902054828110156103e95760405162461bcd60e51b81526004016101eb906109b1565b336001600160a01b03851614610449576001600160a01b03841661041f5760405162461bcd60e51b81526004016101eb906108eb565b3360009081526020819052604080822085840390556001600160a01b038616825290208054840190555b505b826001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516101989190610871565b6001600160a01b0387166104b45760405162461bcd60e51b81526004016101eb9061097a565b8342106104d35760405162461bcd60e51b81526004016101eb90610952565b6001600160a01b038716600081815260026020908152604091829020805460018181019092559251909261055192610536927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928e928e928e92918e910161087a565b604051602081830303815290604052805190602001206106a0565b8585856040516000815260200160405260405161057194939291906108cd565b6020604051602081039080840390855afa158015610593573d6000803e3d6000fd5b505050602060405103516001600160a01b0316146105c35760405162461bcd60e51b81526004016101eb906109e1565b6001600160a01b038088166000818152600160209081526040808320948b168084529490915290819020889055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061061e908990610871565b60405180910390a350505050505050565b600160209081526000928352604080842090915290825290205481565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001610683939291906108ae565b604051602081830303815290604052805190602001209050919050565b600060405180604001604052806002815260200161190160f01b8152506106c561032d565b8360405160200161068393929190610822565b80356001600160a01b03811681146101a457600080fd5b600060208284031215610700578081fd5b61070a83836106d8565b9392505050565b60008060408385031215610723578081fd5b61072d84846106d8565b915061073c84602085016106d8565b90509250929050565b600080600060608486031215610759578081fd5b833561076481610a18565b9250602084013561077481610a18565b929592945050506040919091013590565b600080600080600080600060e0888a03121561079f578283fd5b6107a989896106d8565b96506107b88960208a016106d8565b95506040880135945060608801359350608088013560ff811681146107db578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561080a578182fd5b61081484846106d8565b946020939093013593505050565b60008451815b818110156108425760208188018101518583015201610828565b818111156108505782828501525b5091909101928352506020820152604001919050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b92835260208301919091526001600160a01b0316604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b60208082526016908201527545524332303a206e6f207a65726f206164647265737360501b604082015260600190565b60208082526018908201527f45524332303a20616c6c6f77616e636520746f6f206c6f770000000000000000604082015260600190565b6020808252600e908201526d115490cc8c0e88115e1c1a5c995960921b604082015260600190565b60208082526018908201527f45524332303a204f776e65722063616e6e6f7420626520300000000000000000604082015260600190565b60208082526016908201527545524332303a2062616c616e636520746f6f206c6f7760501b604082015260600190565b60208082526018908201527f45524332303a20496e76616c6964205369676e61747572650000000000000000604082015260600190565b6001600160a01b0381168114610a2d57600080fd5b5056fea26469706673582212207b3ad05e45be79776618efa9efe9313dbc02b99831194aa7454b65f35e91b09364736f6c634300060c0033",
              "opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CHAINID PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH2 0x20 DUP2 PUSH2 0x29 JUMP JUMPDEST PUSH1 0x80 MSTORE POP PUSH2 0x9C JUMP JUMPDEST PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x60 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x7D 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 SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH2 0xA66 PUSH2 0xBF PUSH1 0x0 CODECOPY DUP1 PUSH2 0x332 MSTORE POP DUP1 PUSH2 0x367 MSTORE POP PUSH2 0xA66 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 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7ECEBE00 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0xF1 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x104 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x117 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x12C JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0xC9 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xDE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA0 PUSH2 0x9B CALLDATASIZE PUSH1 0x4 PUSH2 0x7F8 JUMP JUMPDEST PUSH2 0x13F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x866 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA0 PUSH2 0xC4 CALLDATASIZE PUSH1 0x4 PUSH2 0x745 JUMP JUMPDEST PUSH2 0x1AA JUMP JUMPDEST PUSH2 0xD1 PUSH2 0x32D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH2 0xD1 PUSH2 0xEC CALLDATASIZE PUSH1 0x4 PUSH2 0x6EF JUMP JUMPDEST PUSH2 0x38D JUMP JUMPDEST PUSH2 0xD1 PUSH2 0xFF CALLDATASIZE PUSH1 0x4 PUSH2 0x6EF JUMP JUMPDEST PUSH2 0x39F JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x112 CALLDATASIZE PUSH1 0x4 PUSH2 0x7F8 JUMP JUMPDEST PUSH2 0x3B1 JUMP JUMPDEST PUSH2 0x12A PUSH2 0x125 CALLDATASIZE PUSH1 0x4 PUSH2 0x785 JUMP JUMPDEST PUSH2 0x48E JUMP JUMPDEST STOP JUMPDEST PUSH2 0xD1 PUSH2 0x13A CALLDATASIZE PUSH1 0x4 PUSH2 0x711 JUMP JUMPDEST PUSH2 0x62F JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP6 SWAP1 SSTORE MLOAD SWAP2 SWAP3 SWAP1 SWAP2 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0x198 SWAP1 DUP7 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO PUSH2 0x2D8 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 LT ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x9B1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2D6 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x0 NOT DUP2 EQ PUSH2 0x283 JUMPI DUP4 DUP2 LT ISZERO PUSH2 0x25A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x91B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP5 DUP3 SUB SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x2A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x8EB JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP7 DUP6 SUB SWAP1 SSTORE SWAP2 DUP7 AND DUP2 MSTORE KECCAK256 DUP1 SLOAD DUP5 ADD SWAP1 SSTORE JUMPDEST POP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x31B SWAP2 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x365 JUMPI PUSH2 0x360 DUP2 PUSH2 0x64C JUMP JUMPDEST PUSH2 0x387 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO PUSH2 0x44B JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 LT ISZERO PUSH2 0x3E9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x9B1 JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EQ PUSH2 0x449 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x41F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x8EB JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP6 DUP5 SUB SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP5 ADD SWAP1 SSTORE JUMPDEST POP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x198 SWAP2 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x4B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x97A JUMP JUMPDEST DUP4 TIMESTAMP LT PUSH2 0x4D3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x952 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 DUP2 ADD SWAP1 SWAP3 SSTORE SWAP3 MLOAD SWAP1 SWAP3 PUSH2 0x551 SWAP3 PUSH2 0x536 SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 DUP15 SWAP2 ADD PUSH2 0x87A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x6A0 JUMP JUMPDEST DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x571 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x593 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x5C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x9E1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP9 SWAP1 SSTORE MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0x61E SWAP1 DUP10 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 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 PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x683 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x8AE 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 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH2 0x6C5 PUSH2 0x32D JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x683 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x822 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x700 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x70A DUP4 DUP4 PUSH2 0x6D8 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x723 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x72D DUP5 DUP5 PUSH2 0x6D8 JUMP JUMPDEST SWAP2 POP PUSH2 0x73C DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x6D8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x759 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x764 DUP2 PUSH2 0xA18 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x774 DUP2 PUSH2 0xA18 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x79F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x7A9 DUP10 DUP10 PUSH2 0x6D8 JUMP JUMPDEST SWAP7 POP PUSH2 0x7B8 DUP10 PUSH1 0x20 DUP11 ADD PUSH2 0x6D8 JUMP JUMPDEST SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7DB JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 PUSH1 0xA0 DUP5 ADD CALLDATALOAD SWAP5 POP PUSH1 0xC0 SWAP1 SWAP4 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x80A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x814 DUP5 DUP5 PUSH2 0x6D8 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x842 JUMPI PUSH1 0x20 DUP2 DUP9 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x828 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x850 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 SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP3 SWAP1 SWAP4 AND PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 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 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x45524332303A206E6F207A65726F2061646472657373 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20616C6C6F77616E636520746F6F206C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH14 0x115490CC8C0E88115E1C1A5C9959 PUSH1 0x92 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A204F776E65722063616E6E6F7420626520300000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x45524332303A2062616C616E636520746F6F206C6F77 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20496E76616C6964205369676E61747572650000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xA2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0x3AD05E45BE79776618EFA9EFE9313DBC02B99831194AA7454B65F35E SWAP2 0xB0 SWAP4 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "7316:4412:0:-:0;;;;;;;;;;;;-1:-1:-1;5837:9:0;5911:35;;;;5885:62;5837:9;5885:25;:62::i;:::-;5865:82;;-1:-1:-1;7316:4412:0;;5556:185;5630:7;5155:68;5710:7;5727:4;5666:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5656:78;;;;;;5649:85;;5556:185;;;:::o;365:444:-1:-;196:37;;;712:2;697:18;;196:37;;;;-1:-1;;;;;1055:54;795:2;780:18;;76:37;548:2;533:18;;519:290::o;:::-;7316:4412:0;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "338": [
                  {
                    "length": 32,
                    "start": 871
                  }
                ],
                "340": [
                  {
                    "length": 32,
                    "start": 818
                  }
                ]
              },
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100885760003560e01c80637ecebe001161005b5780637ecebe00146100f1578063a9059cbb14610104578063d505accf14610117578063dd62ed3e1461012c57610088565b8063095ea7b31461008d57806323b872dd146100b65780633644e515146100c957806370a08231146100de575b600080fd5b6100a061009b3660046107f8565b61013f565b6040516100ad9190610866565b60405180910390f35b6100a06100c4366004610745565b6101aa565b6100d161032d565b6040516100ad9190610871565b6100d16100ec3660046106ef565b61038d565b6100d16100ff3660046106ef565b61039f565b6100a06101123660046107f8565b6103b1565b61012a610125366004610785565b61048e565b005b6100d161013a366004610711565b61062f565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610198908690610871565b60405180910390a35060015b92915050565b600081156102d8576001600160a01b038416600090815260208190526040902054828110156101f45760405162461bcd60e51b81526004016101eb906109b1565b60405180910390fd5b836001600160a01b0316856001600160a01b0316146102d6576001600160a01b03851660009081526001602090815260408083203384529091529020546000198114610283578381101561025a5760405162461bcd60e51b81526004016101eb9061091b565b6001600160a01b0386166000908152600160209081526040808320338452909152902084820390555b6001600160a01b0385166102a95760405162461bcd60e51b81526004016101eb906108eb565b506001600160a01b0380861660009081526020819052604080822086850390559186168152208054840190555b505b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161031b9190610871565b60405180910390a35060019392505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610365576103608161064c565b610387565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006020819052908152604090205481565b60026020526000908152604090205481565b6000811561044b5733600090815260208190526040902054828110156103e95760405162461bcd60e51b81526004016101eb906109b1565b336001600160a01b03851614610449576001600160a01b03841661041f5760405162461bcd60e51b81526004016101eb906108eb565b3360009081526020819052604080822085840390556001600160a01b038616825290208054840190555b505b826001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516101989190610871565b6001600160a01b0387166104b45760405162461bcd60e51b81526004016101eb9061097a565b8342106104d35760405162461bcd60e51b81526004016101eb90610952565b6001600160a01b038716600081815260026020908152604091829020805460018181019092559251909261055192610536927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928e928e928e92918e910161087a565b604051602081830303815290604052805190602001206106a0565b8585856040516000815260200160405260405161057194939291906108cd565b6020604051602081039080840390855afa158015610593573d6000803e3d6000fd5b505050602060405103516001600160a01b0316146105c35760405162461bcd60e51b81526004016101eb906109e1565b6001600160a01b038088166000818152600160209081526040808320948b168084529490915290819020889055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061061e908990610871565b60405180910390a350505050505050565b600160209081526000928352604080842090915290825290205481565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001610683939291906108ae565b604051602081830303815290604052805190602001209050919050565b600060405180604001604052806002815260200161190160f01b8152506106c561032d565b8360405160200161068393929190610822565b80356001600160a01b03811681146101a457600080fd5b600060208284031215610700578081fd5b61070a83836106d8565b9392505050565b60008060408385031215610723578081fd5b61072d84846106d8565b915061073c84602085016106d8565b90509250929050565b600080600060608486031215610759578081fd5b833561076481610a18565b9250602084013561077481610a18565b929592945050506040919091013590565b600080600080600080600060e0888a03121561079f578283fd5b6107a989896106d8565b96506107b88960208a016106d8565b95506040880135945060608801359350608088013560ff811681146107db578384fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561080a578182fd5b61081484846106d8565b946020939093013593505050565b60008451815b818110156108425760208188018101518583015201610828565b818111156108505782828501525b5091909101928352506020820152604001919050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b92835260208301919091526001600160a01b0316604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b60208082526016908201527545524332303a206e6f207a65726f206164647265737360501b604082015260600190565b60208082526018908201527f45524332303a20616c6c6f77616e636520746f6f206c6f770000000000000000604082015260600190565b6020808252600e908201526d115490cc8c0e88115e1c1a5c995960921b604082015260600190565b60208082526018908201527f45524332303a204f776e65722063616e6e6f7420626520300000000000000000604082015260600190565b60208082526016908201527545524332303a2062616c616e636520746f6f206c6f7760501b604082015260600190565b60208082526018908201527f45524332303a20496e76616c6964205369676e61747572650000000000000000604082015260600190565b6001600160a01b0381168114610a2d57600080fd5b5056fea26469706673582212207b3ad05e45be79776618efa9efe9313dbc02b99831194aa7454b65f35e91b09364736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7ECEBE00 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0xF1 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x104 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x117 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x12C JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0xC9 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0xDE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA0 PUSH2 0x9B CALLDATASIZE PUSH1 0x4 PUSH2 0x7F8 JUMP JUMPDEST PUSH2 0x13F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x866 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA0 PUSH2 0xC4 CALLDATASIZE PUSH1 0x4 PUSH2 0x745 JUMP JUMPDEST PUSH2 0x1AA JUMP JUMPDEST PUSH2 0xD1 PUSH2 0x32D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH2 0xD1 PUSH2 0xEC CALLDATASIZE PUSH1 0x4 PUSH2 0x6EF JUMP JUMPDEST PUSH2 0x38D JUMP JUMPDEST PUSH2 0xD1 PUSH2 0xFF CALLDATASIZE PUSH1 0x4 PUSH2 0x6EF JUMP JUMPDEST PUSH2 0x39F JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x112 CALLDATASIZE PUSH1 0x4 PUSH2 0x7F8 JUMP JUMPDEST PUSH2 0x3B1 JUMP JUMPDEST PUSH2 0x12A PUSH2 0x125 CALLDATASIZE PUSH1 0x4 PUSH2 0x785 JUMP JUMPDEST PUSH2 0x48E JUMP JUMPDEST STOP JUMPDEST PUSH2 0xD1 PUSH2 0x13A CALLDATASIZE PUSH1 0x4 PUSH2 0x711 JUMP JUMPDEST PUSH2 0x62F JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP6 SWAP1 SSTORE MLOAD SWAP2 SWAP3 SWAP1 SWAP2 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0x198 SWAP1 DUP7 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO PUSH2 0x2D8 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 LT ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x9B1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2D6 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x0 NOT DUP2 EQ PUSH2 0x283 JUMPI DUP4 DUP2 LT ISZERO PUSH2 0x25A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x91B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP5 DUP3 SUB SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x2A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x8EB JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP7 DUP6 SUB SWAP1 SSTORE SWAP2 DUP7 AND DUP2 MSTORE KECCAK256 DUP1 SLOAD DUP5 ADD SWAP1 SSTORE JUMPDEST POP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x31B SWAP2 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0x365 JUMPI PUSH2 0x360 DUP2 PUSH2 0x64C JUMP JUMPDEST PUSH2 0x387 JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO PUSH2 0x44B JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 LT ISZERO PUSH2 0x3E9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x9B1 JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EQ PUSH2 0x449 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x41F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x8EB JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP6 DUP5 SUB SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP5 ADD SWAP1 SSTORE JUMPDEST POP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x198 SWAP2 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x4B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x97A JUMP JUMPDEST DUP4 TIMESTAMP LT PUSH2 0x4D3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x952 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 DUP2 ADD SWAP1 SWAP3 SSTORE SWAP3 MLOAD SWAP1 SWAP3 PUSH2 0x551 SWAP3 PUSH2 0x536 SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 DUP15 SWAP2 ADD PUSH2 0x87A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x6A0 JUMP JUMPDEST DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x571 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x593 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x5C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1EB SWAP1 PUSH2 0x9E1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP9 SWAP1 SSTORE MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0x61E SWAP1 DUP10 SWAP1 PUSH2 0x871 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 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 PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x683 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x8AE 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 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH2 0x6C5 PUSH2 0x32D JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x683 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x822 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x700 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x70A DUP4 DUP4 PUSH2 0x6D8 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x723 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x72D DUP5 DUP5 PUSH2 0x6D8 JUMP JUMPDEST SWAP2 POP PUSH2 0x73C DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0x6D8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x759 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x764 DUP2 PUSH2 0xA18 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x774 DUP2 PUSH2 0xA18 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x79F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x7A9 DUP10 DUP10 PUSH2 0x6D8 JUMP JUMPDEST SWAP7 POP PUSH2 0x7B8 DUP10 PUSH1 0x20 DUP11 ADD PUSH2 0x6D8 JUMP JUMPDEST SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7DB JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 PUSH1 0xA0 DUP5 ADD CALLDATALOAD SWAP5 POP PUSH1 0xC0 SWAP1 SWAP4 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x80A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x814 DUP5 DUP5 PUSH2 0x6D8 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x842 JUMPI PUSH1 0x20 DUP2 DUP9 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x828 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x850 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 SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP3 SWAP1 SWAP4 AND PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 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 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x45524332303A206E6F207A65726F2061646472657373 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20616C6C6F77616E636520746F6F206C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH14 0x115490CC8C0E88115E1C1A5C9959 PUSH1 0x92 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A204F776E65722063616E6E6F7420626520300000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x45524332303A2062616C616E636520746F6F206C6F77 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20496E76616C6964205369676E61747572650000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xA2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0x3AD05E45BE79776618EFA9EFE9313DBC02B99831194AA7454B65F35E SWAP2 0xB0 SWAP4 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "7316:4412:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10259:201;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8776:1194;;;;;;:::i;:::-;;:::i;6255:262::-;;;:::i;:::-;;;;;;;:::i;7040:44::-;;;;;;:::i;:::-;;:::i;7270:41::-;;;;;;:::i;:::-;;:::i;7739:737::-;;;;;;:::i;:::-;;:::i;11079:647::-;;;;;;:::i;:::-;;:::i;:::-;;7143:64;;;;;;:::i;:::-;;:::i;10259:201::-;10351:10;10325:4;10341:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;10341:30:0;;;;;;;;;;:39;;;10395:37;10325:4;;10341:30;;10395:37;;;;10374:6;;10395:37;:::i;:::-;;;;;;;;-1:-1:-1;10449:4:0;10259:201;;;;;:::o;8776:1194::-;8886:4;8969:11;;8965:937;;-1:-1:-1;;;;;9017:15:0;;8996:18;9017:15;;;;;;;;;;;9054:20;;;;9046:55;;;;-1:-1:-1;;;9046:55:0;;;;;;;:::i;:::-;;;;;;;;;9128:2;-1:-1:-1;;;;;9120:10:0;:4;-1:-1:-1;;;;;9120:10:0;;9116:776;;-1:-1:-1;;;;;9177:15:0;;9150:24;9177:15;;;:9;:15;;;;;;;;9193:10;9177:27;;;;;;;;-1:-1:-1;;9326:37:0;;9322:248;;9415:6;9395:16;:26;;9387:63;;;;-1:-1:-1;;;9387:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9472:15:0;;;;;;:9;:15;;;;;;;;9488:10;9472:27;;;;;;;9502:25;;;9472:55;;9322:248;-1:-1:-1;;;;;9595:16:0;;9587:51;;;;-1:-1:-1;;;9587:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;9707:15:0;;;:9;:15;;;;;;;;;;;9725:19;;;9707:37;;9786:13;;;;;;:23;;;;;;9116:776;8965:937;;9931:2;-1:-1:-1;;;;;9916:26:0;9925:4;-1:-1:-1;;;;;9916:26:0;;9935:6;9916:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;9959:4:0;8776:1194;;;;;:::o;6255:262::-;6304:7;6382:9;6428:25;6417:36;;:93;;6476:34;6502:7;6476:25;:34::i;:::-;6417:93;;;6456:17;6417:93;6410:100;;;6255:262;:::o;7040:44::-;;;;;;;;;;;;;;:::o;7270:41::-;;;;;;;;;;;;;:::o;7739:737::-;7801:4;7890:11;;7886:516;;7948:10;7917:18;7938:21;;;;;;;;;;;7981:20;;;;7973:55;;;;-1:-1:-1;;;7973:55:0;;;;;;;:::i;:::-;8046:10;-1:-1:-1;;;;;8046:16:0;;;8042:350;;-1:-1:-1;;;;;8090:16:0;;8082:51;;;;-1:-1:-1;;;8082:51:0;;;;;;;:::i;:::-;8211:10;8201:9;:21;;;;;;;;;;;8225:19;;;8201:43;;-1:-1:-1;;;;;8286:13:0;;;;;;:23;;;;;;8042:350;7886:516;;8437:2;-1:-1:-1;;;;;8416:32:0;8425:10;-1:-1:-1;;;;;8416:32:0;;8441:6;8416:32;;;;;;:::i;11079:647::-;-1:-1:-1;;;;;11281:20:0;;11273:57;;;;-1:-1:-1;;;11273:57:0;;;;;;;:::i;:::-;11366:8;11348:15;:26;11340:53;;;;-1:-1:-1;;;11340:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11424:154:0;;11466:21;11513:14;;;:6;:14;;;;;;;;;:16;;11424:128;11513:16;;;;;;11455:85;;11424:128;;11434:108;;11455:85;;10619:66;;11572:6;;11497:7;;11506:5;;11513:16;11531:8;;11455:85;;:::i;:::-;;;;;;;;;;;;;11445:96;;;;;;11434:10;:108::i;:::-;11544:1;11547;11550;11424:128;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11424:154:0;;11403:225;;;;-1:-1:-1;;;11403:225:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11638:17:0;;;;;;;:9;:17;;;;;;;;:26;;;;;;;;;;;;;;:34;;;11687:32;;;;;11667:5;;11687:32;:::i;:::-;;;;;;;;11079:647;;;;;;;:::o;7143:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5556:185::-;5630:7;5155:68;5710:7;5727:4;5666:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5656:78;;;;;;5649:85;;5556:185;;;:::o;6523:202::-;6584:14;6646:40;;;;;;;;;;;;;-1:-1:-1;;;6646:40:0;;;6688:18;:16;:18::i;:::-;6708:8;6629:88;;;;;;;;;;:::i;5:130:-1:-;72:20;;-1:-1;;;;;12486:54;;13136:35;;13126:2;;13185:1;;13175:12;549:241;;653:2;641:9;632:7;628:23;624:32;621:2;;;-1:-1;;659:12;621:2;721:53;766:7;742:22;721:53;:::i;:::-;711:63;615:175;-1:-1;;;615:175::o;797:366::-;;;918:2;906:9;897:7;893:23;889:32;886:2;;;-1:-1;;924:12;886:2;986:53;1031:7;1007:22;986:53;:::i;:::-;976:63;;1094:53;1139:7;1076:2;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;880:283;;;;;:::o;1170:491::-;;;;1308:2;1296:9;1287:7;1283:23;1279:32;1276:2;;;-1:-1;;1314:12;1276:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1366:63;-1:-1;1466:2;1505:22;;72:20;97:33;72:20;97:33;:::i;:::-;1270:391;;1474:63;;-1:-1;;;1574:2;1613:22;;;;346:20;;1270:391::o;1668:991::-;;;;;;;;1872:3;1860:9;1851:7;1847:23;1843:33;1840:2;;;-1:-1;;1879:12;1840:2;1941:53;1986:7;1962:22;1941:53;:::i;:::-;1931:63;;2049:53;2094:7;2031:2;2074:9;2070:22;2049:53;:::i;:::-;2039:63;;2139:2;2182:9;2178:22;346:20;2147:63;;2247:2;2290:9;2286:22;346:20;2255:63;;2355:3;2397:9;2393:22;481:20;12702:4;13532:5;12691:16;13509:5;13506:33;13496:2;;-1:-1;;13543:12;13496:2;1834:825;;;;-1:-1;1834:825;;;;2364:61;2462:3;2502:22;;209:20;;-1:-1;2571:3;2611:22;;;209:20;;1834:825;-1:-1;;1834:825::o;2666:366::-;;;2787:2;2775:9;2766:7;2762:23;2758:32;2755:2;;;-1:-1;;2793:12;2755:2;2855:53;2900:7;2876:22;2855:53;:::i;:::-;2845:63;2945:2;2984:22;;;;346:20;;-1:-1;;;2749:283::o;6134:553::-;;3712:5;11788:12;-1:-1;12792:101;12806:6;12803:1;12800:13;12792:101;;;3857:4;12873:11;;;;;12867:18;12854:11;;;12847:39;12821:10;12792:101;;;12908:6;12905:1;12902:13;12899:2;;;-1:-1;12964:6;12959:3;12955:16;12948:27;12899:2;-1:-1;3888:16;;;;3341:37;;;-1:-1;3857:4;6539:12;;3341:37;6650:12;;;6326:361;-1:-1;6326:361::o;6694:210::-;12319:13;;12312:21;3224:34;;6815:2;6800:18;;6786:118::o;6911:222::-;3341:37;;;7038:2;7023:18;;7009:124::o;7140:780::-;3341:37;;;-1:-1;;;;;12486:54;;;7572:2;7557:18;;3110:37;12486:54;;;;7655:2;7640:18;;3110:37;7738:2;7723:18;;3341:37;7821:3;7806:19;;3341:37;;;;12497:42;7890:19;;3341:37;7407:3;7392:19;;7378:542::o;7927:444::-;3341:37;;;8274:2;8259:18;;3341:37;;;;-1:-1;;;;;12486:54;8357:2;8342:18;;3110:37;8110:2;8095:18;;8081:290::o;8378:548::-;3341:37;;;12702:4;12691:16;;;;8746:2;8731:18;;6087:35;8829:2;8814:18;;3341:37;8912:2;8897:18;;3341:37;8585:3;8570:19;;8556:370::o;8933:416::-;9133:2;9147:47;;;4141:2;9118:18;;;11933:19;-1:-1;;;11973:14;;;4157:45;4221:12;;;9104:245::o;9356:416::-;9556:2;9570:47;;;4472:2;9541:18;;;11933:19;4508:26;11973:14;;;4488:47;4554:12;;;9527:245::o;9779:416::-;9979:2;9993:47;;;4805:2;9964:18;;;11933:19;-1:-1;;;11973:14;;;4821:37;4877:12;;;9950:245::o;10202:416::-;10402:2;10416:47;;;5128:2;10387:18;;;11933:19;5164:26;11973:14;;;5144:47;5210:12;;;10373:245::o;10625:416::-;10825:2;10839:47;;;5461:2;10810:18;;;11933:19;-1:-1;;;11973:14;;;5477:45;5541:12;;;10796:245::o;11048:416::-;11248:2;11262:47;;;5792:2;11233:18;;;11933:19;5828:26;11973:14;;;5808:47;5874:12;;;11219:245::o;13077:117::-;-1:-1;;;;;12486:54;;13136:35;;13126:2;;13185:1;;13175:12;13126:2;13120:74;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "532400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite",
                "allowance(address,address)": "infinite",
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "1327",
                "nonces(address)": "1257",
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite",
                "transfer(address,uint256)": "infinite",
                "transferFrom(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "nonces(address)": "7ecebe00",
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "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\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"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\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Return the DOMAIN_SEPARATOR\"},\"approve(address,uint256)\":{\"params\":{\"amount\":\"The maximum collective amount that `spender` can draw.\",\"spender\":\"Address of the party that can draw from msg.sender's account.\"},\"returns\":{\"_0\":\"(bool) Returns True if approved.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"This permit must be redeemed before this deadline (UTC timestamp in seconds).\",\"owner_\":\"Address of the owner.\",\"spender\":\"The address of the spender that gets approved to draw from `owner_`.\",\"value\":\"The maximum collective amount that `spender` can draw.\"}},\"transfer(address,uint256)\":{\"params\":{\"amount\":\"of the tokens to move.\",\"to\":\"The address to move the tokens.\"},\"returns\":{\"_0\":\"(bool) Returns True if succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"amount\":\"The token amount to move.\",\"from\":\"Address to draw tokens from.\",\"to\":\"The address to move the tokens.\"},\"returns\":{\"_0\":\"(bool) Returns True if succeeded.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"owner > spender > allowance mapping.\"},\"approve(address,uint256)\":{\"notice\":\"Approves `amount` from sender to be spend by `spender`.\"},\"balanceOf(address)\":{\"notice\":\"owner > balance mapping.\"},\"nonces(address)\":{\"notice\":\"owner > nonce mapping. Used in `permit`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Approves `value` from `owner_` to be spend by `spender`.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers `amount` tokens from `msg.sender` to `to`.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"ERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 423,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:ERC20",
                "label": "balanceOf",
                "offset": 0,
                "slot": "0",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 430,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:ERC20",
                "label": "allowance",
                "offset": 0,
                "slot": "1",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 435,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:ERC20",
                "label": "nonces",
                "offset": 0,
                "slot": "2",
                "type": "t_mapping(t_address,t_uint256)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "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": {
              "allowance(address,address)": {
                "notice": "owner > spender > allowance mapping."
              },
              "approve(address,uint256)": {
                "notice": "Approves `amount` from sender to be spend by `spender`."
              },
              "balanceOf(address)": {
                "notice": "owner > balance mapping."
              },
              "nonces(address)": {
                "notice": "owner > nonce mapping. Used in `permit`."
              },
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "notice": "Approves `value` from `owner_` to be spend by `spender`."
              },
              "transfer(address,uint256)": {
                "notice": "Transfers `amount` tokens from `msg.sender` to `to`."
              },
              "transferFrom(address,address,uint256)": {
                "notice": "Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`."
              }
            },
            "version": 1
          }
        },
        "ERC20Data": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50610188806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806370a08231146100465780637ecebe001461006f578063dd62ed3e14610082575b600080fd5b6100596100543660046100f3565b610095565b6040516100669190610149565b60405180910390f35b61005961007d3660046100f3565b6100a7565b610059610090366004610115565b6100b9565b60006020819052908152604090205481565b60026020526000908152604090205481565b600160209081526000928352604080842090915290825290205481565b80356001600160a01b03811681146100ed57600080fd5b92915050565b600060208284031215610104578081fd5b61010e83836100d6565b9392505050565b60008060408385031215610127578081fd5b61013184846100d6565b915061014084602085016100d6565b90509250929050565b9081526020019056fea2646970667358221220fb17904f779590d86484add040a1cef29fec2ae49e8a3bf3ae4b72e318fb22d464736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x188 DUP1 PUSH2 0x20 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 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x82 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x54 CALLDATASIZE PUSH1 0x4 PUSH2 0xF3 JUMP JUMPDEST PUSH2 0x95 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x66 SWAP2 SWAP1 PUSH2 0x149 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x59 PUSH2 0x7D CALLDATASIZE PUSH1 0x4 PUSH2 0xF3 JUMP JUMPDEST PUSH2 0xA7 JUMP JUMPDEST PUSH2 0x59 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0x115 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 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 DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x104 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x10E DUP4 DUP4 PUSH2 0xD6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x127 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x131 DUP5 DUP5 PUSH2 0xD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x140 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xD6 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFB OR SWAP1 0x4F PUSH24 0x9590D86484ADD040A1CEF29FEC2AE49E8A3BF3AE4B72E318 0xFB 0x22 0xD4 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "6974:340:0:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c806370a08231146100465780637ecebe001461006f578063dd62ed3e14610082575b600080fd5b6100596100543660046100f3565b610095565b6040516100669190610149565b60405180910390f35b61005961007d3660046100f3565b6100a7565b610059610090366004610115565b6100b9565b60006020819052908152604090205481565b60026020526000908152604090205481565b600160209081526000928352604080842090915290825290205481565b80356001600160a01b03811681146100ed57600080fd5b92915050565b600060208284031215610104578081fd5b61010e83836100d6565b9392505050565b60008060408385031215610127578081fd5b61013184846100d6565b915061014084602085016100d6565b90509250929050565b9081526020019056fea2646970667358221220fb17904f779590d86484add040a1cef29fec2ae49e8a3bf3ae4b72e318fb22d464736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x82 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x54 CALLDATASIZE PUSH1 0x4 PUSH2 0xF3 JUMP JUMPDEST PUSH2 0x95 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x66 SWAP2 SWAP1 PUSH2 0x149 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x59 PUSH2 0x7D CALLDATASIZE PUSH1 0x4 PUSH2 0xF3 JUMP JUMPDEST PUSH2 0xA7 JUMP JUMPDEST PUSH2 0x59 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0x115 JUMP JUMPDEST PUSH2 0xB9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 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 DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x104 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x10E DUP4 DUP4 PUSH2 0xD6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x127 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x131 DUP5 DUP5 PUSH2 0xD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x140 DUP5 PUSH1 0x20 DUP6 ADD PUSH2 0xD6 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFB OR SWAP1 0x4F PUSH24 0x9590D86484ADD040A1CEF29FEC2AE49E8A3BF3AE4B72E318 0xFB 0x22 0xD4 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "6974:340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7040:44;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7270:41;;;;;;:::i;:::-;;:::i;7143:64::-;;;;;;:::i;:::-;;:::i;7040:44::-;;;;;;;;;;;;;;:::o;7270:41::-;;;;;;;;;;;;;:::o;7143:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;-1:-1;;;;;1272:54;;1476:35;;1466:2;;1525:1;;1515:12;1466:2;57:78;;;;:::o;142:241::-;;246:2;234:9;225:7;221:23;217:32;214:2;;;-1:-1;;252:12;214:2;314:53;359:7;335:22;314:53;:::i;:::-;304:63;208:175;-1:-1;;;208:175::o;390:366::-;;;511:2;499:9;490:7;486:23;482:32;479:2;;;-1:-1;;517:12;479:2;579:53;624:7;600:22;579:53;:::i;:::-;569:63;;687:53;732:7;669:2;712:9;708:22;687:53;:::i;:::-;677:63;;473:283;;;;;:::o;883:222::-;834:37;;;1010:2;995:18;;981:124::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "78400",
                "executionCost": "129",
                "totalCost": "78529"
              },
              "external": {
                "allowance(address,address)": "infinite",
                "balanceOf(address)": "1238",
                "nonces(address)": "1257"
              }
            },
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "balanceOf(address)": "70a08231",
              "nonces(address)": "7ecebe00"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowance(address,address)\":{\"notice\":\"owner > spender > allowance mapping.\"},\"balanceOf(address)\":{\"notice\":\"owner > balance mapping.\"},\"nonces(address)\":{\"notice\":\"owner > nonce mapping. Used in `permit`.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"ERC20Data\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 423,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:ERC20Data",
                "label": "balanceOf",
                "offset": 0,
                "slot": "0",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 430,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:ERC20Data",
                "label": "allowance",
                "offset": 0,
                "slot": "1",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 435,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:ERC20Data",
                "label": "nonces",
                "offset": 0,
                "slot": "2",
                "type": "t_mapping(t_address,t_uint256)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "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": {
              "allowance(address,address)": {
                "notice": "owner > spender > allowance mapping."
              },
              "balanceOf(address)": {
                "notice": "owner > balance mapping."
              },
              "nonces(address)": {
                "notice": "owner > nonce mapping. Used in `permit`."
              }
            },
            "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": {},
            "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\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"IBatchFlashBorrower\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IBentoBoxV1": {
          "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"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "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": "address",
                  "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": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyDivest",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyInvest",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyLoss",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyProfit",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "strategy",
                  "type": "address"
                }
              ],
              "name": "LogStrategyQueued",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "strategy",
                  "type": "address"
                }
              ],
              "name": "LogStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "targetPercentage",
                  "type": "uint256"
                }
              ],
              "name": "LogStrategyTargetPercentage",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "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": "address",
                  "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": [
                {
                  "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": [],
              "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": [
                {
                  "components": [
                    {
                      "internalType": "uint128",
                      "name": "elastic",
                      "type": "uint128"
                    },
                    {
                      "internalType": "uint128",
                      "name": "base",
                      "type": "uint128"
                    }
                  ],
                  "internalType": "struct Rebase",
                  "name": "totals_",
                  "type": "tuple"
                }
              ],
              "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"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "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\":[{\"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\":\"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\":\"address\",\"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\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyDivest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyInvest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyLoss\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LogStrategyProfit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"LogStrategyQueued\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"LogStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"targetPercentage\",\"type\":\"uint256\"}],\"name\":\"LogStrategyTargetPercentage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"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\":\"address\",\"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\":[{\"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\":[],\"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\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"elastic\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"base\",\"type\":\"uint128\"}],\"internalType\":\"struct Rebase\",\"name\":\"totals_\",\"type\":\"tuple\"}],\"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\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"IBentoBoxV1\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "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": [
                {
                  "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",
              "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\":[{\"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/bentobox/KashiPairMediumRiskV1.sol\":\"IERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"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": {},
            "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\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"IFlashBorrower\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "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/bentobox/KashiPairMediumRiskV1.sol\":\"IMasterContract\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"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
          }
        },
        "IOracle": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "get",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "success",
                  "type": "bool"
                },
                {
                  "internalType": "uint256",
                  "name": "rate",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "peek",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "success",
                  "type": "bool"
                },
                {
                  "internalType": "uint256",
                  "name": "rate",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "peekSpot",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "rate",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "get(bytes)": {
                "params": {
                  "data": "Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));"
                },
                "returns": {
                  "rate": "The rate of the requested asset / pair / pool.",
                  "success": "if no valid (recent) rate is available, return false else true."
                }
              },
              "name(bytes)": {
                "params": {
                  "data": "Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));"
                },
                "returns": {
                  "_0": "(string) A human readable name about this oracle."
                }
              },
              "peek(bytes)": {
                "params": {
                  "data": "Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));"
                },
                "returns": {
                  "rate": "The rate of the requested asset / pair / pool.",
                  "success": "if no valid (recent) rate is available, return false else true."
                }
              },
              "peekSpot(bytes)": {
                "params": {
                  "data": "Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));"
                },
                "returns": {
                  "rate": "The rate of the requested asset / pair / pool."
                }
              },
              "symbol(bytes)": {
                "params": {
                  "data": "Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));"
                },
                "returns": {
                  "_0": "(string) A human readable symbol name about this oracle."
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "get(bytes)": "d6d7d525",
              "name(bytes)": "d568866c",
              "peek(bytes)": "eeb8a8d3",
              "peekSpot(bytes)": "d39bbef0",
              "symbol(bytes)": "c699c4d6"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"get\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"peek\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"peekSpot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"get(bytes)\":{\"params\":{\"data\":\"Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\"},\"returns\":{\"rate\":\"The rate of the requested asset / pair / pool.\",\"success\":\"if no valid (recent) rate is available, return false else true.\"}},\"name(bytes)\":{\"params\":{\"data\":\"Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\"},\"returns\":{\"_0\":\"(string) A human readable name about this oracle.\"}},\"peek(bytes)\":{\"params\":{\"data\":\"Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\"},\"returns\":{\"rate\":\"The rate of the requested asset / pair / pool.\",\"success\":\"if no valid (recent) rate is available, return false else true.\"}},\"peekSpot(bytes)\":{\"params\":{\"data\":\"Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\"},\"returns\":{\"rate\":\"The rate of the requested asset / pair / pool.\"}},\"symbol(bytes)\":{\"params\":{\"data\":\"Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle. For example: (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\"},\"returns\":{\"_0\":\"(string) A human readable symbol name about this oracle.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"get(bytes)\":{\"notice\":\"Get the latest exchange rate.\"},\"name(bytes)\":{\"notice\":\"Returns a human readable name about this oracle.\"},\"peek(bytes)\":{\"notice\":\"Check the last exchange rate without any state changes.\"},\"peekSpot(bytes)\":{\"notice\":\"Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\"},\"symbol(bytes)\":{\"notice\":\"Returns a human readable (short) name about this oracle.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"IOracle\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "get(bytes)": {
                "notice": "Get the latest exchange rate."
              },
              "name(bytes)": {
                "notice": "Returns a human readable name about this oracle."
              },
              "peek(bytes)": {
                "notice": "Check the last exchange rate without any state changes."
              },
              "peekSpot(bytes)": {
                "notice": "Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek()."
              },
              "symbol(bytes)": {
                "notice": "Returns a human readable (short) name about this oracle."
              }
            },
            "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": {},
            "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\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"IStrategy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ISwapper": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "fromToken",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20",
                  "name": "toToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "shareToMin",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "shareFrom",
                  "type": "uint256"
                }
              ],
              "name": "swap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "extraShare",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "shareReturned",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "fromToken",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20",
                  "name": "toToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "refundTo",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "shareFromSupplied",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "shareToExact",
                  "type": "uint256"
                }
              ],
              "name": "swapExact",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "shareUsed",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "shareReturned",
                  "type": "uint256"
                }
              ],
              "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": {
              "swap(address,address,address,uint256,uint256)": "e343fe12",
              "swapExact(address,address,address,address,uint256,uint256)": "4622be90"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"toToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shareToMin\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareFrom\",\"type\":\"uint256\"}],\"name\":\"swap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"extraShare\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareReturned\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"toToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundTo\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shareFromSupplied\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareToExact\",\"type\":\"uint256\"}],\"name\":\"swapExact\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shareUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"shareReturned\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"swap(address,address,address,uint256,uint256)\":{\"notice\":\"Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper. Swaps it for at least 'amountToMin' of token 'to'. Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer. Returns the amount of tokens 'to' transferred to BentoBox. (The BentoBox skim function will be used by the caller to get the swapped funds).\"},\"swapExact(address,address,address,address,uint256,uint256)\":{\"notice\":\"Calculates the amount of token 'from' needed to complete the swap (amountFrom), this should be less than or equal to amountFromMax. Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper. Swaps it for exactly 'exactAmountTo' of token 'to'. Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer. Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom). Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom). (The BentoBox skim function will be used by the caller to get the swapped funds).\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"ISwapper\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "swap(address,address,address,uint256,uint256)": {
                "notice": "Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper. Swaps it for at least 'amountToMin' of token 'to'. Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer. Returns the amount of tokens 'to' transferred to BentoBox. (The BentoBox skim function will be used by the caller to get the swapped funds)."
              },
              "swapExact(address,address,address,address,uint256,uint256)": {
                "notice": "Calculates the amount of token 'from' needed to complete the swap (amountFrom), this should be less than or equal to amountFromMax. Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper. Swaps it for exactly 'exactAmountTo' of token 'to'. Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer. Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom). Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom). (The BentoBox skim function will be used by the caller to get the swapped funds)."
              }
            },
            "version": 1
          }
        },
        "KashiPairMediumRiskV1": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract IBentoBoxV1",
                  "name": "bentoBox_",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "_owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "_spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "_value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "accruedAmount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "feeFraction",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint64",
                  "name": "rate",
                  "type": "uint64"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "utilization",
                  "type": "uint256"
                }
              ],
              "name": "LogAccrue",
              "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": "share",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "fraction",
                  "type": "uint256"
                }
              ],
              "name": "LogAddAsset",
              "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": "share",
                  "type": "uint256"
                }
              ],
              "name": "LogAddCollateral",
              "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": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "feeAmount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "part",
                  "type": "uint256"
                }
              ],
              "name": "LogBorrow",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "rate",
                  "type": "uint256"
                }
              ],
              "name": "LogExchangeRate",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newFeeTo",
                  "type": "address"
                }
              ],
              "name": "LogFeeTo",
              "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": "share",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "fraction",
                  "type": "uint256"
                }
              ],
              "name": "LogRemoveAsset",
              "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": "share",
                  "type": "uint256"
                }
              ],
              "name": "LogRemoveCollateral",
              "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": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "part",
                  "type": "uint256"
                }
              ],
              "name": "LogRepay",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "feeTo",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "feesEarnedFraction",
                  "type": "uint256"
                }
              ],
              "name": "LogWithdrawFees",
              "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"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "_from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "_to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "_value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accrue",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accrueInfo",
              "outputs": [
                {
                  "internalType": "uint64",
                  "name": "interestPerSecond",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "lastAccrued",
                  "type": "uint64"
                },
                {
                  "internalType": "uint128",
                  "name": "feesEarnedFraction",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "skim",
                  "type": "bool"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "addAsset",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "fraction",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "skim",
                  "type": "bool"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "addCollateral",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "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": [],
              "name": "asset",
              "outputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "bentoBox",
              "outputs": [
                {
                  "internalType": "contract IBentoBoxV1",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "borrow",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "part",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "claimOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "collateral",
              "outputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint8[]",
                  "name": "actions",
                  "type": "uint8[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "values",
                  "type": "uint256[]"
                },
                {
                  "internalType": "bytes[]",
                  "name": "datas",
                  "type": "bytes[]"
                }
              ],
              "name": "cook",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "value1",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "value2",
                  "type": "uint256"
                }
              ],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "exchangeRate",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "feeTo",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "init",
              "outputs": [],
              "stateMutability": "payable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address[]",
                  "name": "users",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "maxBorrowParts",
                  "type": "uint256[]"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "contract ISwapper",
                  "name": "swapper",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "open",
                  "type": "bool"
                }
              ],
              "name": "liquidate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "masterContract",
              "outputs": [
                {
                  "internalType": "contract KashiPairMediumRiskV1",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "oracle",
              "outputs": [
                {
                  "internalType": "contract IOracle",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "oracleData",
              "outputs": [
                {
                  "internalType": "bytes",
                  "name": "",
                  "type": "bytes"
                }
              ],
              "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": "address",
                  "name": "owner_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "fraction",
                  "type": "uint256"
                }
              ],
              "name": "removeAsset",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "share",
                  "type": "uint256"
                }
              ],
              "name": "removeCollateral",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "skim",
                  "type": "bool"
                },
                {
                  "internalType": "uint256",
                  "name": "part",
                  "type": "uint256"
                }
              ],
              "name": "repay",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newFeeTo",
                  "type": "address"
                }
              ],
              "name": "setFeeTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ISwapper",
                  "name": "swapper",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "enable",
                  "type": "bool"
                }
              ],
              "name": "setSwapper",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ISwapper",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "swappers",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalAsset",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "elastic",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "base",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalBorrow",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "elastic",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "base",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalCollateralShare",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "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": [],
              "name": "updateExchangeRate",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "updated",
                  "type": "bool"
                },
                {
                  "internalType": "uint256",
                  "name": "rate",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "userBorrowPart",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "userCollateralShare",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "withdrawFees",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "This contract allows contract calls to any contract (except BentoBox) from arbitrary callers thus, don't trust calls from this contract in any circumstances.",
            "kind": "dev",
            "methods": {
              "DOMAIN_SEPARATOR()": {
                "details": "Return the DOMAIN_SEPARATOR"
              },
              "addAsset(address,bool,uint256)": {
                "params": {
                  "share": "The amount of shares to add.",
                  "skim": "True if the amount should be skimmed from the deposit balance of msg.sender. False if tokens from msg.sender in `bentoBox` should be transferred.",
                  "to": "The address of the user to receive the assets."
                },
                "returns": {
                  "fraction": "Total fractions added."
                }
              },
              "addCollateral(address,bool,uint256)": {
                "params": {
                  "share": "The amount of shares to add for `to`.",
                  "skim": "True if the amount should be skimmed from the deposit balance of msg.sender. False if tokens from msg.sender in `bentoBox` should be transferred.",
                  "to": "The receiver of the tokens."
                }
              },
              "approve(address,uint256)": {
                "params": {
                  "amount": "The maximum collective amount that `spender` can draw.",
                  "spender": "Address of the party that can draw from msg.sender's account."
                },
                "returns": {
                  "_0": "(bool) Returns True if approved."
                }
              },
              "borrow(address,uint256)": {
                "returns": {
                  "part": "Total part of the debt held by borrowers.",
                  "share": "Total amount in shares borrowed."
                }
              },
              "cook(uint8[],uint256[],bytes[])": {
                "params": {
                  "actions": "An array with a sequence of actions to execute (see ACTION_ declarations).",
                  "datas": "A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.",
                  "values": "A one-to-one mapped array to `actions`. ETH amounts to send along with the actions. Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`."
                },
                "returns": {
                  "value1": "May contain the first positioned return value of the last executed action (if applicable).",
                  "value2": "May contain the second positioned return value of the last executed action which returns 2 values (if applicable)."
                }
              },
              "init(bytes)": {
                "details": "`data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)"
              },
              "liquidate(address[],uint256[],address,address,bool)": {
                "params": {
                  "maxBorrowParts": "A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.",
                  "open": "True to perform a open liquidation else False.",
                  "swapper": "Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.",
                  "to": "Address of the receiver in open liquidations if `swapper` is zero.",
                  "users": "An array of user addresses."
                }
              },
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "params": {
                  "deadline": "This permit must be redeemed before this deadline (UTC timestamp in seconds).",
                  "owner_": "Address of the owner.",
                  "spender": "The address of the spender that gets approved to draw from `owner_`.",
                  "value": "The maximum collective amount that `spender` can draw."
                }
              },
              "removeAsset(address,uint256)": {
                "params": {
                  "fraction": "The amount/fraction of assets held to remove.",
                  "to": "The user that receives the removed assets."
                },
                "returns": {
                  "share": "The amount of shares transferred to `to`."
                }
              },
              "removeCollateral(address,uint256)": {
                "params": {
                  "share": "Amount of shares to remove.",
                  "to": "The receiver of the shares."
                }
              },
              "repay(address,bool,uint256)": {
                "params": {
                  "part": "The amount to repay. See `userBorrowPart`.",
                  "skim": "True if the amount should be skimmed from the deposit balance of msg.sender. False if tokens from msg.sender in `bentoBox` should be transferred.",
                  "to": "Address of the user this payment should go."
                },
                "returns": {
                  "amount": "The total amount repayed."
                }
              },
              "setFeeTo(address)": {
                "params": {
                  "newFeeTo": "The address of the receiver."
                }
              },
              "setSwapper(address,bool)": {
                "params": {
                  "enable": "True to enable the swapper. To disable use False.",
                  "swapper": "The address of the swapper contract that conforms to `ISwapper`."
                }
              },
              "transfer(address,uint256)": {
                "params": {
                  "amount": "of the tokens to move.",
                  "to": "The address to move the tokens."
                },
                "returns": {
                  "_0": "(bool) Returns True if succeeded."
                }
              },
              "transferFrom(address,address,uint256)": {
                "params": {
                  "amount": "The token amount to move.",
                  "from": "Address to draw tokens from.",
                  "to": "The address to move the tokens."
                },
                "returns": {
                  "_0": "(bool) Returns True if succeeded."
                }
              },
              "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."
                }
              },
              "updateExchangeRate()": {
                "returns": {
                  "rate": "The new exchange rate.",
                  "updated": "True if `exchangeRate` was updated."
                }
              }
            },
            "title": "KashiPair",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "6101006040523480156200001257600080fd5b50604051620060ba380380620060ba833981016040819052620000359162000110565b4660a08190526200004681620000ba565b60805250600380546001600160a01b031916339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606091821b1660c05230901b60e052600580546001600160a01b031916331790556200015f565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001620000f39392919062000140565b604051602081830303815290604052805190602001209050919050565b60006020828403121562000122578081fd5b81516001600160a01b038116811462000139578182fd5b9392505050565b92835260208301919091526001600160a01b0316604082015260600190565b60805160a05160c05160601c60e05160601c615e846200023660003980610d8c5280611f1f528061220f52806128ea52508061141652806115de52806116b6528061182952806119ce5280611afd5280611e765280611fda528061210a52806121c952806123a352806124ec52806126505280612d7352806132c352806133cb528061348d5280613645528061370552806138d65280613ba45280613cf35280613e1c5280613fa9528061405f528061413b52806142c052806145bb5280614642525080610cb5525080610cea5250615e846000f3fe6080604052600436106102725760003560e01c8063656f3d641161014f5780638da5cb5b116100c1578063d8dfeb451161007a578063d8dfeb45146106f1578063dd62ed3e14610706578063e30c397814610726578063f46901ed1461073b578063f8ba4cff1461075b578063f9557ccb1461077057610272565b80638da5cb5b1461064e57806395d89b4114610663578063a9059cbb14610678578063b27c0e7414610698578063cd446e22146106bc578063d505accf146106d157610272565b80637dc0d1d0116101135780637dc0d1d0146105965780637ecebe00146105ab5780638285ef40146105cb578063860ffea1146105ee578063876467f81461060e5780638cad7fbe1461062e57610272565b8063656f3d64146105195780636b2ace871461052c57806370a082311461054157806374645ff31461056157806376ee101b1461057657610272565b8063313ce567116101e8578063473e3ce7116101ac578063473e3ce714610479578063476343ee1461048e57806348e4163e146104a35780634b8a3529146104c35780634ddf47d4146104f15780634e71e0c81461050457610272565b8063313ce567146103f85780633644e5151461041a57806338d52e0f1461042f5780633ba0b9a9146104445780633f2617cb1461045957610272565b806315294c401161023a57806315294c401461033657806318160ddd146103635780631b51e940146103785780631c9e379b146103985780632317ef67146103b857806323b872dd146103d857610272565b8063017e7e581461027757806302ce728f146102a257806306fdde03146102c5578063078dfbe7146102e7578063095ea7b314610309575b600080fd5b34801561028357600080fd5b5061028c610785565b604051610299919061550e565b60405180910390f35b3480156102ae57600080fd5b506102b7610794565b604051610299929190615566565b3480156102d157600080fd5b506102da610871565b60405161029991906155f0565b3480156102f357600080fd5b50610307610302366004614d93565b610949565b005b34801561031557600080fd5b50610329610324366004614e0c565b610a39565b604051610299919061555b565b34801561034257600080fd5b50610356610351366004614ddd565b610aa4565b6040516102999190615576565b34801561036f57600080fd5b50610356610ac1565b34801561038457600080fd5b50610356610393366004614ddd565b610ad7565b3480156103a457600080fd5b506103566103b3366004614b7c565b610aec565b3480156103c457600080fd5b506103566103d3366004614e0c565b610afe565b3480156103e457600080fd5b506103296103f3366004614ce3565b610b19565b34801561040457600080fd5b5061040d610c93565b6040516102999190615d12565b34801561042657600080fd5b50610356610cb0565b34801561043b57600080fd5b5061028c610d10565b34801561045057600080fd5b50610356610d1f565b34801561046557600080fd5b5061030761047436600461521d565b610d25565b34801561048557600080fd5b50610356610d7a565b34801561049a57600080fd5b50610307610d80565b3480156104af57600080fd5b506103566104be366004614b7c565b610ebd565b3480156104cf57600080fd5b506104e36104de366004614e0c565b610ecf565b604051610299929190615cc2565b6103076104ff366004614fee565b610f1d565b34801561051057600080fd5b50610307611000565b6104e3610527366004614edc565b61108e565b34801561053857600080fd5b5061028c6119cc565b34801561054d57600080fd5b5061035661055c366004614b7c565b6119f0565b34801561056d57600080fd5b506102da611a02565b34801561058257600080fd5b50610307610591366004614e37565b611a90565b3480156105a257600080fd5b5061028c61259a565b3480156105b757600080fd5b506103566105c6366004614b7c565b6125a9565b3480156105d757600080fd5b506105e06125bb565b604051610299929190615ca8565b3480156105fa57600080fd5b50610307610609366004614ddd565b6125d5565b34801561061a57600080fd5b50610307610629366004614e0c565b6126b6565b34801561063a57600080fd5b50610329610649366004614b7c565b6126f6565b34801561065a57600080fd5b5061028c61270b565b34801561066f57600080fd5b506102da61271a565b34801561068457600080fd5b50610329610693366004614e0c565b6127de565b3480156106a457600080fd5b506106ad6128bb565b60405161029993929190615ce6565b3480156106c857600080fd5b5061028c6128e8565b3480156106dd57600080fd5b506103076106ec366004614d23565b61290c565b3480156106fd57600080fd5b5061028c612aad565b34801561071257600080fd5b50610356610721366004614cab565b612abc565b34801561073257600080fd5b5061028c612ad9565b34801561074757600080fd5b50610307610756366004614b7c565b612ae8565b34801561076757600080fd5b50610307612b5c565b34801561077c57600080fd5b506105e061311e565b6005546001600160a01b031681565b60095460405163d6d7d52560e01b815260009182916001600160a01b039091169063d6d7d525906107ca90600a90600401615603565b6040805180830381600087803b1580156107e357600080fd5b505af11580156107f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081b9190614f8d565b909250905081156108685760108190556040517f9f9192b5edb17356c524e08d9e025c8e2f6307e6ea52fb7968faa3081f51c3c89061085b908390615576565b60405180910390a161086d565b506010545b9091565b600754606090610889906001600160a01b0316613138565b60085461089e906001600160a01b0316613138565b60095460405163355a219b60e21b81526001600160a01b039091169063d568866c906108cf90600a90600401615603565b60006040518083038186803b1580156108e757600080fd5b505afa1580156108fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261092391908101906152ac565b60405160200161093593929190615424565b604051602081830303815290604052905090565b6003546001600160a01b0316331461097c5760405162461bcd60e51b815260040161097390615a9d565b60405180910390fd5b8115610a18576001600160a01b0383161515806109965750805b6109b25760405162461bcd60e51b8152600401610973906158de565b6003546040516001600160a01b038086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0385166001600160a01b031991821617909155600480549091169055610a34565b600480546001600160a01b0319166001600160a01b0385161790555b505050565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a92908690615576565b60405180910390a35060015b92915050565b6000610aae612b5c565b610ab98484846131fd565b949350505050565b600c54600160801b90046001600160801b031690565b6000610ae1612b5c565b610ab9848484613436565b600e6020526000908152604090205481565b6000610b08612b5c565b610b1283836136b1565b9392505050565b60008115610c3e576001600160a01b03841660009081526020819052604090205482811015610b5a5760405162461bcd60e51b815260040161097390615b6c565b836001600160a01b0316856001600160a01b031614610c3c576001600160a01b03851660009081526001602090815260408083203384529091529020546000198114610be95783811015610bc05760405162461bcd60e51b8152600401610973906159d8565b6001600160a01b0386166000908152600160209081526040808320338452909152902084820390555b6001600160a01b038516610c0f5760405162461bcd60e51b815260040161097390615877565b506001600160a01b0380861660009081526020819052604080822086850390559186168152208054840190555b505b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c819190615576565b60405180910390a35060019392505050565b600854600090610cab906001600160a01b031661394f565b905090565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ce857610ce381613a08565b610d0a565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6008546001600160a01b031681565b60105481565b6003546001600160a01b03163314610d4f5760405162461bcd60e51b815260040161097390615a9d565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600b5481565b610d88612b5c565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015610de357600080fd5b505afa158015610df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1b9190614b98565b6011546001600160a01b038216600090815260208190526040902054919250600160801b90046001600160801b031690610e559082613a5c565b6001600160a01b0383166000818152602081905260409081902092909255601180546001600160801b0316905590517fbe641c3ffc44b2d6c184f023fa4ed7bda4b6ffa71e03b3c98ae0c776da1f17e790610eb1908490615576565b60405180910390a25050565b600f6020526000908152604090205481565b600080610eda612b5c565b610ee48484613a7f565b8092508193505050610efa336000601054613d6d565b610f165760405162461bcd60e51b815260040161097390615a66565b9250929050565b6007546001600160a01b031615610f465760405162461bcd60e51b815260040161097390615840565b610f5281830183615173565b805160079060009060089082906009908290610f7590600a9060208a01906149af565b5081546001600160a01b0398891661010092830a908102908a021990911617909155825497871691810a918202918702199097161790558154958416940a93840293830219909416929092179092555060075416610fe55760405162461bcd60e51b8152600401610973906159ab565b50506011805467ffffffffffffffff19166312e687c0179055565b6004546001600160a01b031633811461102b5760405162461bcd60e51b815260040161097390615ad2565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b039092166001600160a01b0319928316179055600480549091169055565b600080611099614a29565b60005b8881101561198e5760008a8a838181106110b257fe5b90506020020160208101906110c7919061535b565b905082602001511580156110de5750600a8160ff16105b156110f3576110eb612b5c565b600160208401525b60ff8116600a141561114d57600080600089898681811061111057fe5b90506020028101906111229190615d20565b81019061112f9190615286565b9250925092506111458282610609868c8c613ee8565b505050611985565b60ff8116600114156111ae57600080600089898681811061116a57fe5b905060200281019061117c9190615d20565b8101906111899190615286565b9250925092506111a4828261119f868c8c613ee8565b613436565b9750505050611985565b60ff81166002141561120e5760008060008989868181106111cb57fe5b90506020028101906111dd9190615d20565b8101906111ea9190615286565b9250925092506112058282611200868c8c613ee8565b6131fd565b50505050611985565b60ff8116600314156112695760008088888581811061122957fe5b905060200281019061123b9190615d20565b8101906112489190615262565b915091506112608161125b848a8a613ee8565b6136b1565b96505050611985565b60ff8116600414156112c65760008088888581811061128457fe5b90506020028101906112969190615d20565b8101906112a39190615262565b915091506112bb816112b6848a8a613ee8565b613f10565b505060018352611985565b60ff811660051415611329576000808888858181106112e157fe5b90506020028101906112f39190615d20565b8101906113009190615262565b9150915061131881611313848a8a613ee8565b613a7f565b600187529097509550611985915050565b60ff8116600b14156113c857600080600089898681811061134657fe5b90506020028101906113589190615d20565b8101906113659190614fba565b925092509250600080611376610794565b915091508415806113845750815b801561138f57508381115b80156113a257508215806113a257508281115b6113be5760405162461bcd60e51b815260040161097390615c41565b5050505050611985565b60ff8116601814156114a7576000806000806000808c8c898181106113e957fe5b90506020028101906113fb9190615d20565b8101906114089190614bb4565b9550955095509550955095507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c0a47c938787878787876040518763ffffffff1660e01b815260040161146a96959493929190615522565b600060405180830381600087803b15801561148457600080fd5b505af1158015611498573d6000803e3d6000fd5b50505050505050505050611985565b60ff81166014141561152f576115258787848181106114c257fe5b90506020028101906114d49190615d20565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c915086905081811061151757fe5b90506020020135878761401e565b9095509350611985565b60ff81166015141561159a5761152587878481811061154a57fe5b905060200281019061155c9190615d20565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992508891506141149050565b60ff8116601614156116725760008060008989868181106115b757fe5b90506020028101906115c99190615d20565b8101906115d69190614ce3565b9250925092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f18d03cc843385611619868e8e613ee8565b6040518563ffffffff1660e01b815260040161163894939291906156a7565b600060405180830381600087803b15801561165257600080fd5b505af1158015611666573d6000803e3d6000fd5b50505050505050611985565b60ff81166017141561170657600060608089898681811061168f57fe5b90506020028101906116a19190615d20565b8101906116ae91906150a1565b9250925092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fca8843843385856040518563ffffffff1660e01b81526004016116389493929190615705565b60ff8116601e14156117e057606060006117888b8b8681811061172557fe5b905060200201358a8a8781811061173857fe5b905060200281019061174a9190615d20565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508b91506142029050565b915091508060ff16600114156117b357818060200190518101906117ac9190615320565b96506117d9565b8060ff16600214156117d957818060200190518101906117d39190615338565b90975095505b5050611985565b60ff8116600614156119085760008787848181106117fa57fe5b905060200281019061180c9190615d20565b810190611819919061524a565b6008549091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163da5139ca9116611890611860858b8b613ee8565b60408051808201909152600d546001600160801b038082168352600160801b9091041660208201529060016143b8565b60016040518463ffffffff1660e01b81526004016118b0939291906157ca565b60206040518083038186803b1580156118c857600080fd5b505afa1580156118dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119009190615320565b955050611985565b60ff81166007141561198557600087878481811061192257fe5b90506020028101906119349190615d20565b810190611941919061524a565b9050611981611951828888613ee8565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906000614451565b9550505b5060010161109c565b508051156119c0576119a4336000601054613d6d565b6119c05760405162461bcd60e51b815260040161097390615a66565b50965096945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006020819052908152604090205481565b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611a885780601f10611a5d57610100808354040283529160200191611a88565b820191906000526020600020905b815481529060010190602001808311611a6b57829003601f168201915b505050505081565b6000611a9a610794565b915050611aa5612b5c565b6000806000611ab2614a29565b5060408051808201909152600d546001600160801b038082168352600160801b909104166020820152611ae3614a29565b600754604051634ffe34db60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692634ffe34db92611b3692919091169060040161550e565b604080518083038186803b158015611b4d57600080fd5b505afa158015611b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8591906152de565b905060005b8c811015611dac5760008e8e83818110611ba057fe5b9050602002016020810190611bb59190614b7c565b9050611bc2818a8a613d6d565b611da3576001600160a01b0381166000908152600f6020526040812054808f8f86818110611bec57fe5b9050602002013511611c10578e8e85818110611c0457fe5b90506020020135611c12565b805b9150611c1e81836144ca565b6001600160a01b0384166000908152600f60205260408120919091559050611c478683836143b8565b90506000611c8269152d02c7e14af6800000611c708d611c6a866201b5806144ed565b906144ed565b81611c7757fe5b889190046000614451565b6001600160a01b0385166000908152600e6020526040902054909150611ca890826144ca565b6001600160a01b038086166000908152600e60205260409020919091558d1615611cd2578c611cd4565b8d5b6001600160a01b0316846001600160a01b03167f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40283604051611d169190615576565b60405180910390a36001600160a01b03808516908e1615611d37578d611d39565b335b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e8486604051611d73929190615cc2565b60405180910390a3611d858a82613a5c565b9950611d918983613a5c565b9850611d9d8884613a5c565b97505050505b50600101611b8a565b5083611dca5760405162461bcd60e51b8152600401610973906158a7565b611de7611dd685614524565b83516001600160801b031690614551565b6001600160801b03168252611e12611dfe84614524565b60208401516001600160801b031690614551565b6001600160801b03908116602084018190528351600d80546001600160801b03191691841691909117909216600160801b909102179055600b54611e5690866144ca565b600b55600854604051636d289ce560e11b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263da5139ca92611eb192169089906001906004016157ca565b60206040518083038186803b158015611ec957600080fd5b505afa158015611edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f019190615320565b90508761239657604051634656bfdf60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638cad7fbe90611f54908c9060040161550e565b60206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190614f71565b611fc05760405162461bcd60e51b815260040161097390615bd3565b600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261201992919091169030908e908c906004016156a7565b600060405180830381600087803b15801561203357600080fd5b505af1158015612047573d6000803e3d6000fd5b50506007546008546040516371a1ff0960e11b81526001600160a01b03808f16955063e343fe129450612087938116921690309087908d906004016156d1565b6040805180830381600087803b1580156120a057600080fd5b505af11580156120b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d89190615338565b5050600c54600854604051633de222bb60e21b815260009261219b926001600160801b03909116916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f7888aec92612145929190911690309060040161568d565b60206040518083038186803b15801561215d57600080fd5b505afa158015612171573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121959190615320565b906144ca565b905060006121a982846144ca565b90506000620186a06121bd836127106144ed565b816121c457fe5b0490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f18d03cc600860009054906101000a90046001600160a01b0316307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561226657600080fd5b505afa15801561227a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229e9190614b98565b856040518563ffffffff1660e01b81526004016122be94939291906156a7565b600060405180830381600087803b1580156122d857600080fd5b505af11580156122ec573d6000803e3d6000fd5b5050505061232061230e61230983866144ca90919063ffffffff16565b614524565b600c546001600160801b031690614580565b600c80546001600160801b0319166001600160801b0392909216919091179055306001600160a01b038d167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e3861237685856144ca565b6000604051612386929190615cc2565b60405180910390a350505061258a565b6007546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163f18d03cc919081169030908d16156123de578c6123e0565b8d5b8a6040518563ffffffff1660e01b815260040161240094939291906156a7565b600060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b505050506001600160a01b038916156124d2576007546008546040516371a1ff0960e11b81526001600160a01b03808d169363e343fe129361247e93918316921690339087908d906004016156d1565b6040805180830381600087803b15801561249757600080fd5b505af11580156124ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cf9190615338565b50505b600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261252b9291909116903390309087906004016156a7565b600060405180830381600087803b15801561254557600080fd5b505af1158015612559573d6000803e3d6000fd5b5050505061256961230e82614524565b600c80546001600160801b0319166001600160801b03929092169190911790555b5050505050505050505050505050565b6009546001600160a01b031681565b60026020526000908152604090205481565b600d546001600160801b0380821691600160801b90041682565b6001600160a01b0383166000908152600e60205260409020546125f89082613a5c565b6001600160a01b0384166000908152600e6020526040902055600b5461261e8183613a5c565b600b55600754612639906001600160a01b03168383866145af565b836001600160a01b03168361264e5733612670565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167f9ed03113de523cebfe5e49d5f8e12894b1c0d42ce805990461726444c90eab87846040516126a89190615576565b60405180910390a350505050565b6126be612b5c565b6126c88282613f10565b6126d6336000601054613d6d565b6126f25760405162461bcd60e51b815260040161097390615a66565b5050565b60066020526000908152604090205460ff1681565b6003546001600160a01b031681565b600754606090612732906001600160a01b03166146b6565b600854612747906001600160a01b03166146b6565b60095460405163634ce26b60e11b81526001600160a01b039091169063c699c4d69061277890600a90600401615603565b60006040518083038186803b15801561279057600080fd5b505afa1580156127a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127cc91908101906152ac565b604051602001610935939291906154a1565b600081156128785733600090815260208190526040902054828110156128165760405162461bcd60e51b815260040161097390615b6c565b336001600160a01b03851614612876576001600160a01b03841661284c5760405162461bcd60e51b815260040161097390615877565b3360009081526020819052604080822085840390556001600160a01b038616825290208054840190555b505b826001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a929190615576565b6011546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b0387166129325760405162461bcd60e51b815260040161097390615b07565b8342106129515760405162461bcd60e51b815260040161097390615a3e565b6001600160a01b03871660008181526002602090815260409182902080546001818101909255925190926129cf926129b4927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928e928e928e92918e910161557f565b604051602081830303815290604052805190602001206146fd565b858585604051600081526020016040526040516129ef94939291906155d2565b6020604051602081039080840390855afa158015612a11573d6000803e3d6000fd5b505050602060405103516001600160a01b031614612a415760405162461bcd60e51b815260040161097390615c71565b6001600160a01b038088166000818152600160209081526040808320948b168084529490915290819020889055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612a9c908990615576565b60405180910390a350505050505050565b6007546001600160a01b031681565b600160209081526000928352604080842090915290825290205481565b6004546001600160a01b031681565b6003546001600160a01b03163314612b125760405162461bcd60e51b815260040161097390615a9d565b600580546001600160a01b0319166001600160a01b0383169081179091556040517fcf1d3f17e521c635e0d20b8acba94ba170afc041d0546d46dafa09d3c9c19eb390600090a250565b612b64614a40565b50604080516060810182526011546001600160401b038082168352600160401b82041660208301819052600160801b9091046001600160801b03169282019290925290420380612bb557505061311c565b6001600160401b0342166020830152612bcc614a29565b5060408051808201909152600d546001600160801b038082168352600160801b9091041660208201819052612cbe5782516001600160401b03166312e687c014612c56576312e687c08084526040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b91612c4d91600091829182906157ed565b60405180910390a15b5050805160118054602084015160409094015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b9390941692909202929092176001600160801b03908116600160801b919092160217905561311c565b600080612cc9614a29565b5060408051808201909152600c546001600160801b038082168352600160801b9091048116602083015286518551670de0b6b3a764000092612d1b928992611c6a9216906001600160401b03166144ed565b81612d2257fe5b049250612d42612d3184614524565b85516001600160801b031690614580565b6001600160801b03168085526008548251604051630acc462360e31b8152600093612e039390926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811693635662311893612dad9392169190889060040161579e565b60206040518083038186803b158015612dc557600080fd5b505afa158015612dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dfd9190615320565b90613a5c565b90506000620186a0612e17866127106144ed565b81612e1e57fe5b04905081612e4284602001516001600160801b0316836144ed90919063ffffffff16565b81612e4957fe5b049350612e6c612e5885614524565b60408a01516001600160801b031690614580565b6001600160801b03166040890152612e9a612e8685614524565b60208501516001600160801b031690614580565b600c80546001600160801b03908116600160801b9382168402179091558751600d805460208b01516001600160801b031990911692841692831784169316909302919091179091556000908390612ef990670de0b6b3a76400006144ed565b81612f0057fe5b0490506709b6e64a8ec60000811015612fc25760006709b6e64a8ec60000612f34670de0b6b3a7640000611c6a83866144ca565b81612f3b57fe5b0490506000612f69612f518b611c6a85806144ed565b7054a2b63d65d79d094abb6688000000000090613a5c565b8b519091508190612f94906001600160401b03167054a2b63d65d79d094abb668800000000006144ed565b81612f9b57fe5b046001600160401b0316808c526304b9a1f01115612fbb576304b9a1f08b525b5050613073565b670b1a2bc2ec5000008111156130735760006702c68af0bb140000612ffb670de0b6b3a7640000611c6a85670b1a2bc2ec5000006144ca565b8161300257fe5b0490506000613018612f518b611c6a85806144ed565b8b519091506000907054a2b63d65d79d094abb6688000000000090613046906001600160401b0316846144ed565b8161304d57fe5b0490506449d482460081111561306557506449d48246005b6001600160401b03168b5250505b88516040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b916130a9918991899186906157ed565b60405180910390a1505086516011805460208a01516040909a015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b93909a1692909202989098176001600160801b03908116600160801b9190921602179096555050505050505b565b600c546001600160801b0380821691600160801b90041682565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009183916001600160a01b0386169161317f91906153bf565b600060405180830381855afa9150503d80600081146131ba576040519150601f19603f3d011682016040523d82523d6000602084013e6131bf565b606091505b5091509150816131ea57604051806040016040528060038152602001623f3f3f60e81b8152506131f3565b6131f381614735565b925050505b919050565b60408051808201909152600d546001600160801b038082168352600160801b9091041660208201526000906132349083600161489a565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b0386166000908152600f90925260409091205490915061329290836144ca565b6001600160a01b038086166000908152600f6020526040808220939093556008549251636d289ce560e11b815290927f000000000000000000000000000000000000000000000000000000000000000083169263da5139ca92613300929091169086906001906004016157ca565b60206040518083038186803b15801561331857600080fd5b505afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133509190615320565b600c546008549192506001600160801b031690613378906001600160a01b03168383886145af565b61339461338483614524565b6001600160801b03831690614580565b600c80546001600160801b0319166001600160801b03929092169190911790556001600160a01b038616856133c957336133eb565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e8587604051613425929190615cc2565b60405180910390a350509392505050565b6000613440614a29565b50604080518082018252600c546001600160801b03808216808452600160801b90920481166020840152600854600d549451636d289ce560e11b8152939492936000936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169463da5139ca946134c994921692169060019060040161579e565b60206040518083038186803b1580156134e157600080fd5b505afa1580156134f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135199190615320565b83516001600160801b0316019050801561355b578061354e84602001516001600160801b0316876144ed90919063ffffffff16565b8161355557fe5b0461355d565b845b93506103e861358261356e86614524565b60208601516001600160801b031690614580565b6001600160801b0316101561359d5760009350505050610b12565b6135a883868661490f565b8051600c80546020938401516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b03881660009081529081905260409020546136019085613a5c565b6001600160a01b0380891660009081526020819052604090209190915560085461362e91168684896145af565b866001600160a01b0316866136435733613665565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e38878760405161369f929190615cc2565b60405180910390a35050509392505050565b60006136bb614a29565b50604080518082018252600c546001600160801b038082168352600160801b90910481166020830152600854600d549351636d289ce560e11b815292936000936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169463da5139ca946137429492169291169060019060040161579e565b60206040518083038186803b15801561375a57600080fd5b505afa15801561376e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137929190615320565b825160208401516001600160801b03918216929092019250166137b585836144ed565b816137bc57fe5b3360009081526020819052604090205491900493506137db90856144ca565b336000908152602081905260409020556137f7611dd684614524565b6001600160801b0316825261380e611dfe85614524565b6001600160801b0316602083018190526103e8111561383f5760405162461bcd60e51b815260040161097390615b3e565b8151600c805460208501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556040516001600160a01b0386169033907f6e853a5fd6b51d773691f542ebac8513c9992a51380d4c342031056a64114228906138b49087908990615cc2565b60405180910390a3600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261391592919091169030908a9089906004016156a7565b600060405180830381600087803b15801561392f57600080fd5b505af1158015613943573d6000803e3d6000fd5b50505050505092915050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916060916001600160a01b0386169161399691906153bf565b600060405180830381855afa9150503d80600081146139d1576040519150601f19603f3d011682016040523d82523d6000602084013e6139d6565b606091505b50915091508180156139e9575080516020145b6139f45760126131f3565b808060200190518101906131f39190615377565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001613a3f939291906155b3565b604051602081830303815290604052805190602001209050919050565b81810181811015610a9e5760405162461bcd60e51b815260040161097390615974565b60008080620186a0613a928560326144ed565b81613a9957fe5b049050613ad9613aa98583613a5c565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906001614950565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b03199092169190911716919091179055336000908152600f909252604090912054909350613b2e9084613a5c565b336000818152600f6020526040908190209290925590516001600160a01b03871691907f3a5151e57d3bc9798e7853034ac52293d1a0e12a2b44725e75b03b21f86477a690613b8290889086908990615cd0565b60405180910390a3600854604051636d289ce560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263da5139ca92613be292919091169088906000906004016157ca565b60206040518083038186803b158015613bfa57600080fd5b505afa158015613c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c329190615320565b9150613c3c614a29565b5060408051808201909152600c546001600160801b038082168352600160801b90910416602082018190526103e81115613c885760405162461bcd60e51b815260040161097390615b3e565b613ca5613c9484614524565b82516001600160801b031690614551565b6001600160801b03908116808352600c805460208501518416600160801b026001600160801b0319909116909217909216179055600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc92613d3292919091169030908b9089906004016156a7565b600060405180830381600087803b158015613d4c57600080fd5b505af1158015613d60573d6000803e3d6000fd5b5050505050509250929050565b6001600160a01b0383166000908152600f602052604081205480613d95576001915050610b12565b6001600160a01b0385166000908152600e602052604090205480613dbe57600092505050610b12565b613dc6614a29565b5060408051808201909152600d546001600160801b03808216808452600160801b909204166020830181905290613e04908790611c6a9087906144ed565b81613e0b57fe5b600754919004906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163566231189116613e6b8a613e5657620124f8613e5b565b62012cc85b611c6a886509184e72a0006144ed565b60006040518463ffffffff1660e01b8152600401613e8b939291906157ca565b60206040518083038186803b158015613ea357600080fd5b505afa158015613eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613edb9190615320565b1015979650505050505050565b600080841215613f08576000198414613f015781613f03565b825b610ab9565b509192915050565b336000908152600e6020526040902054613f2a90826144ca565b336000908152600e6020526040902055600b54613f4790826144ca565b600b556040516001600160a01b0383169033907f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40290613f87908590615576565b60405180910390a3600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc92613fe89291909116903090879087906004016156a7565b600060405180830381600087803b15801561400257600080fd5b505af1158015614016573d6000803e3d6000fd5b505050505050565b6000806000806000808980602001905181019061403b919061505a565b935093509350935061404e828989613ee8565b915061405b818989613ee8565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302b9446c8a86338787876040518763ffffffff1660e01b81526004016140b29594939291906156d1565b60408051808303818588803b1580156140ca57600080fd5b505af11580156140de573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906141039190615338565b955095505050505094509492505050565b60008060008060008088806020019051810190614131919061505a565b93509350935093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166397da6d30853386614176878e8e613ee8565b614181878f8f613ee8565b6040518663ffffffff1660e01b81526004016141a19594939291906156d1565b6040805180830381600087803b1580156141ba57600080fd5b505af11580156141ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f29190615338565b9550955050505050935093915050565b606060008060606000806000898060200190518101906142229190614c21565b94509450945094509450828015614237575081155b1561426557838960405160200161424f9291906153db565b60405160208183030381529060405293506142be565b821580156142705750815b1561428857838860405160200161424f9291906153db565b8280156142925750815b156142be578389896040516020016142ac939291906153fd565b60405160208183030381529060405293505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b03161415801561430957506001600160a01b0385163014155b6143255760405162461bcd60e51b815260040161097390615a0f565b60006060866001600160a01b03168d8760405161434291906153bf565b60006040518083038185875af1925050503d806000811461437f576040519150601f19603f3d011682016040523d82523d6000602084013e614384565b606091505b5091509150816143a65760405162461bcd60e51b81526004016109739061590d565b9c919b50909950505050505050505050565b600083602001516001600160801b0316600014156143d7575081610b12565b602084015184516001600160801b03918216916143f6918691166144ed565b816143fd57fe5b04905081801561444157508284600001516001600160801b031661443786602001516001600160801b0316846144ed90919063ffffffff16565b8161443e57fe5b04105b15610b1257610ab9816001613a5c565b82516000906001600160801b031661446a575081610b12565b835160208501516001600160801b0391821691614489918691166144ed565b8161449057fe5b04905081801561444157508284602001516001600160801b031661443786600001516001600160801b0316846144ed90919063ffffffff16565b80820382811115610a9e5760405162461bcd60e51b815260040161097390615811565b60008115806145085750508082028282828161450557fe5b04145b610a9e5760405162461bcd60e51b815260040161097390615c0a565b60006001600160801b0382111561454d5760405162461bcd60e51b81526004016109739061593d565b5090565b8082036001600160801b038084169082161115610a9e5760405162461bcd60e51b815260040161097390615811565b8181016001600160801b038083169082161015610a9e5760405162461bcd60e51b815260040161097390615974565b801561462b57614607827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f7888aec87306040518363ffffffff1660e01b815260040161214592919061568d565b8311156146265760405162461bcd60e51b815260040161097390615b9c565b6146b0565b604051633c6340f360e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc9061467d9087903390309089906004016156a7565b600060405180830381600087803b15801561469757600080fd5b505af11580156146ab573d6000803e3d6000fd5b505050505b50505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009183916001600160a01b0386169161317f91906153bf565b600060405180604001604052806002815260200161190160f01b815250614722610cb0565b83604051602001613a3f939291906153fd565b6060604082511061475b578180602001905181019061475491906152ac565b90506131f8565b81516020141561487a5760005b60208160ff161080156147975750828160ff168151811061478557fe5b01602001516001600160f81b03191615155b156147a457600101614768565b60608160ff166001600160401b03811180156147bf57600080fd5b506040519080825280601f01601f1916602001820160405280156147ea576020820181803683370190505b509050600091505b60208260ff161080156148215750838260ff168151811061480f57fe5b01602001516001600160f81b03191615155b1561487157838260ff168151811061483557fe5b602001015160f81c60f81b818360ff168151811061484f57fe5b60200101906001600160f81b031916908160001a9053506001909101906147f2565b91506131f89050565b506040805180820190915260038152623f3f3f60e81b60208201526131f8565b6148a2614a29565b60006148af8585856143b8565b90506148ce6148bd82614524565b86516001600160801b031690614551565b6001600160801b031685526148f96148e585614524565b60208701516001600160801b031690614551565b6001600160801b03166020860152939492505050565b614917614a29565b614923612d3184614524565b6001600160801b0316845261493a61356e83614524565b6001600160801b03166020850152509192915050565b614958614a29565b6000614965858585614451565b905061498461497385614524565b86516001600160801b031690614580565b6001600160801b031685526148f961499b82614524565b60208701516001600160801b031690614580565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106149f057805160ff1916838001178555614a1d565b82800160010185558215614a1d579182015b82811115614a1d578251825591602001919060010190614a02565b5061454d929150614a60565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b5b8082111561454d5760008155600101614a61565b8035610a9e81615e04565b60008083601f840112614a91578182fd5b5081356001600160401b03811115614aa7578182fd5b6020830191508360208083028501011115610f1657600080fd5b600082601f830112614ad1578081fd5b8135614ae4614adf82615d8a565b615d64565b818152915060208083019084810181840286018201871015614b0557600080fd5b60005b84811015614b2457813584529282019290820190600101614b08565b505050505092915050565b600082601f830112614b3f578081fd5b8151614b4d614adf82615da9565b9150808252836020828501011115614b6457600080fd5b614b75816020840160208601615dd8565b5092915050565b600060208284031215614b8d578081fd5b8135610b1281615e04565b600060208284031215614ba9578081fd5b8151610b1281615e04565b60008060008060008060c08789031215614bcc578182fd5b8635614bd781615e04565b95506020870135614be781615e04565b94506040870135614bf781615e1c565b93506060870135614c0781615e3f565b9598949750929560808101359460a0909101359350915050565b600080600080600060a08688031215614c38578283fd5b8551614c4381615e04565b60208701519095506001600160401b03811115614c5e578384fd5b614c6a88828901614b2f565b9450506040860151614c7b81615e1c565b6060870151909350614c8c81615e1c565b6080870151909250614c9d81615e3f565b809150509295509295909350565b60008060408385031215614cbd578182fd5b8235614cc881615e04565b91506020830135614cd881615e04565b809150509250929050565b600080600060608486031215614cf7578081fd5b8335614d0281615e04565b92506020840135614d1281615e04565b929592945050506040919091013590565b600080600080600080600060e0888a031215614d3d578485fd5b8735614d4881615e04565b96506020880135614d5881615e04565b955060408801359450606088013593506080880135614d7681615e3f565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215614da7578081fd5b8335614db281615e04565b92506020840135614dc281615e1c565b91506040840135614dd281615e1c565b809150509250925092565b600080600060608486031215614df1578081fd5b8335614dfc81615e04565b92506020840135614d1281615e1c565b60008060408385031215614e1e578182fd5b8235614e2981615e04565b946020939093013593505050565b600080600080600080600060a0888a031215614e51578081fd5b87356001600160401b0380821115614e67578283fd5b614e738b838c01614a80565b909950975060208a0135915080821115614e8b578283fd5b50614e988a828b01614a80565b9096509450506040880135614eac81615e04565b92506060880135614ebc81615e04565b91506080880135614ecc81615e1c565b8091505092959891949750929550565b60008060008060008060608789031215614ef4578384fd5b86356001600160401b0380821115614f0a578586fd5b614f168a838b01614a80565b90985096506020890135915080821115614f2e578586fd5b614f3a8a838b01614a80565b90965094506040890135915080821115614f52578384fd5b50614f5f89828a01614a80565b979a9699509497509295939492505050565b600060208284031215614f82578081fd5b8151610b1281615e1c565b60008060408385031215614f9f578182fd5b8251614faa81615e1c565b6020939093015192949293505050565b600080600060608486031215614fce578081fd5b8335614fd981615e1c565b95602085013595506040909401359392505050565b60008060208385031215615000578182fd5b82356001600160401b0380821115615016578384fd5b818501915085601f830112615029578384fd5b813581811115615037578485fd5b866020828501011115615048578485fd5b60209290920196919550909350505050565b6000806000806080858703121561506f578182fd5b845161507a81615e04565b602086015190945061508b81615e04565b6040860151606090960151949790965092505050565b6000806000606084860312156150b5578081fd5b83356150c081615e04565b92506020848101356001600160401b03808211156150dc578384fd5b818701915087601f8301126150ef578384fd5b81356150fd614adf82615d8a565b81815284810190848601868402860187018c1015615119578788fd5b8795505b838610156151435761512f8c82614a75565b83526001959095019491860191860161511d565b5096505050604087013592508083111561515b578384fd5b505061516986828701614ac1565b9150509250925092565b60008060008060808587031215615188578182fd5b843561519381615e04565b935060208501356151a381615e04565b925060408501356151b381615e04565b915060608501356001600160401b038111156151cd578182fd5b8501601f810187136151dd578182fd5b80356151eb614adf82615da9565b8181528860208385010111156151ff578384fd5b81602084016020830137908101602001929092525092959194509250565b6000806040838503121561522f578182fd5b823561523a81615e04565b91506020830135614cd881615e1c565b60006020828403121561525b578081fd5b5035919050565b60008060408385031215615274578182fd5b823591506020830135614cd881615e04565b60008060006060848603121561529a578081fd5b833592506020840135614dc281615e04565b6000602082840312156152bd578081fd5b81516001600160401b038111156152d2578182fd5b610ab984828501614b2f565b6000604082840312156152ef578081fd5b6152f96040615d64565b825161530481615e2a565b8152602083015161531481615e2a565b60208201529392505050565b600060208284031215615331578081fd5b5051919050565b6000806040838503121561534a578182fd5b505080516020909101519092909150565b60006020828403121561536c578081fd5b8135610b1281615e3f565b600060208284031215615388578081fd5b8151610b1281615e3f565b600081518084526153ab816020860160208601615dd8565b601f01601f19169290920160200192915050565b600082516153d1818460208701615dd8565b9190910192915050565b600083516153ed818460208801615dd8565b9190910191825250602001919050565b6000845161540f818460208901615dd8565b91909101928352506020820152604001919050565b600071025b0b9b4349026b2b234bab6902934b9b5960751b82528451615451816012850160208901615dd8565b602f60f81b6012918401918201528451615472816013840160208901615dd8565b602d60f81b601392909101918201528351615494816014840160208801615dd8565b0160140195945050505050565b6000616b6d60f01b825284516154be816002850160208901615dd8565b602f60f81b60029184019182015284516154df816003840160208901615dd8565b602d60f81b600392909101918201528351615501816004840160208801615dd8565b0160040195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152949095166020850152911515604084015260ff166060830152608082015260a081019190915260c00190565b901515815260200190565b9115158252602082015260400190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b92835260208301919091526001600160a01b0316604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b126020830184615393565b6000602080830181845282855460018082166000811461562a576001811461564857615680565b60028304607f16855260ff1983166040890152606088019350615680565b600283048086526156588a615dcc565b885b828110156156765781548b82016040015290840190880161565a565b8a01604001955050505b5091979650505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b60006080820160018060a01b0380881684526020818816818601526080604086015282875180855260a0870191508289019450855b8181101561575857855185168352948301949183019160010161573a565b50508581036060870152865180825290820193509150808601845b8381101561578f57815185529382019390820190600101615773565b50929998505050505050505050565b6001600160a01b039390931683526001600160801b039190911660208301521515604082015260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b93845260208401929092526001600160401b03166040830152606082015260800190565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b6020808252601e908201527f4b61736869506169723a20616c726561647920696e697469616c697a65640000604082015260600190565b60208082526016908201527545524332303a206e6f207a65726f206164647265737360501b604082015260600190565b6020808252601a908201527f4b61736869506169723a20616c6c2061726520736f6c76656e74000000000000604082015260600190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b60208082526016908201527512d85cda1a54185a5c8e8818d85b1b0819985a5b195960521b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526013908201527225b0b9b434a830b4b91d103130b2103830b4b960691b604082015260600190565b60208082526018908201527f45524332303a20616c6c6f77616e636520746f6f206c6f770000000000000000604082015260600190565b60208082526015908201527412d85cda1a54185a5c8e8818d85b89dd0818d85b1b605a1b604082015260600190565b6020808252600e908201526d115490cc8c0e88115e1c1a5c995960921b604082015260600190565b60208082526019908201527f4b61736869506169723a207573657220696e736f6c76656e7400000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526018908201527f45524332303a204f776e65722063616e6e6f7420626520300000000000000000604082015260600190565b6020808252601490820152734b617368693a2062656c6f77206d696e696d756d60601b604082015260600190565b60208082526016908201527545524332303a2062616c616e636520746f6f206c6f7760501b604082015260600190565b60208082526018908201527f4b61736869506169723a20536b696d20746f6f206d7563680000000000000000604082015260600190565b6020808252601a908201527f4b61736869506169723a20496e76616c69642073776170706572000000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b6020808252601690820152754b61736869506169723a2072617465206e6f74206f6b60501b604082015260600190565b60208082526018908201527f45524332303a20496e76616c6964205369676e61747572650000000000000000604082015260600190565b6001600160801b0392831681529116602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160401b0393841681529190921660208201526001600160801b03909116604082015260600190565b60ff91909116815260200190565b6000808335601e19843603018112615d36578283fd5b8301803591506001600160401b03821115615d4f578283fd5b602001915036819003821315610f1657600080fd5b6040518181016001600160401b0381118282101715615d8257600080fd5b604052919050565b60006001600160401b03821115615d9f578081fd5b5060209081020190565b60006001600160401b03821115615dbe578081fd5b50601f01601f191660200190565b60009081526020902090565b60005b83811015615df3578181015183820152602001615ddb565b838111156146b05750506000910152565b6001600160a01b0381168114615e1957600080fd5b50565b8015158114615e1957600080fd5b6001600160801b0381168114615e1957600080fd5b60ff81168114615e1957600080fdfea26469706673582212203f18cc30a2e7d4f78fe66332b8838470cde14db8273f5a89514bc3b7f5698a9e64736f6c634300060c0033",
              "opcodes": "PUSH2 0x100 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x60BA CODESIZE SUB DUP1 PUSH3 0x60BA DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x35 SWAP2 PUSH3 0x110 JUMP JUMPDEST CHAINID PUSH1 0xA0 DUP2 SWAP1 MSTORE PUSH3 0x46 DUP2 PUSH3 0xBA JUMP JUMPDEST PUSH1 0x80 MSTORE POP PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 SWAP2 DUP3 SHL AND PUSH1 0xC0 MSTORE ADDRESS SWAP1 SHL PUSH1 0xE0 MSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR SWAP1 SSTORE PUSH3 0x15F JUMP JUMPDEST PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH3 0xF3 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x140 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 0x122 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x139 JUMPI DUP2 DUP3 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0xA0 MLOAD PUSH1 0xC0 MLOAD PUSH1 0x60 SHR PUSH1 0xE0 MLOAD PUSH1 0x60 SHR PUSH2 0x5E84 PUSH3 0x236 PUSH1 0x0 CODECOPY DUP1 PUSH2 0xD8C MSTORE DUP1 PUSH2 0x1F1F MSTORE DUP1 PUSH2 0x220F MSTORE DUP1 PUSH2 0x28EA MSTORE POP DUP1 PUSH2 0x1416 MSTORE DUP1 PUSH2 0x15DE MSTORE DUP1 PUSH2 0x16B6 MSTORE DUP1 PUSH2 0x1829 MSTORE DUP1 PUSH2 0x19CE MSTORE DUP1 PUSH2 0x1AFD MSTORE DUP1 PUSH2 0x1E76 MSTORE DUP1 PUSH2 0x1FDA MSTORE DUP1 PUSH2 0x210A MSTORE DUP1 PUSH2 0x21C9 MSTORE DUP1 PUSH2 0x23A3 MSTORE DUP1 PUSH2 0x24EC MSTORE DUP1 PUSH2 0x2650 MSTORE DUP1 PUSH2 0x2D73 MSTORE DUP1 PUSH2 0x32C3 MSTORE DUP1 PUSH2 0x33CB MSTORE DUP1 PUSH2 0x348D MSTORE DUP1 PUSH2 0x3645 MSTORE DUP1 PUSH2 0x3705 MSTORE DUP1 PUSH2 0x38D6 MSTORE DUP1 PUSH2 0x3BA4 MSTORE DUP1 PUSH2 0x3CF3 MSTORE DUP1 PUSH2 0x3E1C MSTORE DUP1 PUSH2 0x3FA9 MSTORE DUP1 PUSH2 0x405F MSTORE DUP1 PUSH2 0x413B MSTORE DUP1 PUSH2 0x42C0 MSTORE DUP1 PUSH2 0x45BB MSTORE DUP1 PUSH2 0x4642 MSTORE POP DUP1 PUSH2 0xCB5 MSTORE POP DUP1 PUSH2 0xCEA MSTORE POP PUSH2 0x5E84 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x272 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x656F3D64 GT PUSH2 0x14F JUMPI DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xC1 JUMPI DUP1 PUSH4 0xD8DFEB45 GT PUSH2 0x7A JUMPI DUP1 PUSH4 0xD8DFEB45 EQ PUSH2 0x6F1 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x706 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x726 JUMPI DUP1 PUSH4 0xF46901ED EQ PUSH2 0x73B JUMPI DUP1 PUSH4 0xF8BA4CFF EQ PUSH2 0x75B JUMPI DUP1 PUSH4 0xF9557CCB EQ PUSH2 0x770 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x64E JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x663 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x678 JUMPI DUP1 PUSH4 0xB27C0E74 EQ PUSH2 0x698 JUMPI DUP1 PUSH4 0xCD446E22 EQ PUSH2 0x6BC JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x6D1 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x7DC0D1D0 GT PUSH2 0x113 JUMPI DUP1 PUSH4 0x7DC0D1D0 EQ PUSH2 0x596 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x5AB JUMPI DUP1 PUSH4 0x8285EF40 EQ PUSH2 0x5CB JUMPI DUP1 PUSH4 0x860FFEA1 EQ PUSH2 0x5EE JUMPI DUP1 PUSH4 0x876467F8 EQ PUSH2 0x60E JUMPI DUP1 PUSH4 0x8CAD7FBE EQ PUSH2 0x62E JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x656F3D64 EQ PUSH2 0x519 JUMPI DUP1 PUSH4 0x6B2ACE87 EQ PUSH2 0x52C JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x541 JUMPI DUP1 PUSH4 0x74645FF3 EQ PUSH2 0x561 JUMPI DUP1 PUSH4 0x76EE101B EQ PUSH2 0x576 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x313CE567 GT PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x473E3CE7 GT PUSH2 0x1AC JUMPI DUP1 PUSH4 0x473E3CE7 EQ PUSH2 0x479 JUMPI DUP1 PUSH4 0x476343EE EQ PUSH2 0x48E JUMPI DUP1 PUSH4 0x48E4163E EQ PUSH2 0x4A3 JUMPI DUP1 PUSH4 0x4B8A3529 EQ PUSH2 0x4C3 JUMPI DUP1 PUSH4 0x4DDF47D4 EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x504 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x313CE567 EQ PUSH2 0x3F8 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x41A JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0x42F JUMPI DUP1 PUSH4 0x3BA0B9A9 EQ PUSH2 0x444 JUMPI DUP1 PUSH4 0x3F2617CB EQ PUSH2 0x459 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x15294C40 GT PUSH2 0x23A JUMPI DUP1 PUSH4 0x15294C40 EQ PUSH2 0x336 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x363 JUMPI DUP1 PUSH4 0x1B51E940 EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x1C9E379B EQ PUSH2 0x398 JUMPI DUP1 PUSH4 0x2317EF67 EQ PUSH2 0x3B8 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x3D8 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x17E7E58 EQ PUSH2 0x277 JUMPI DUP1 PUSH4 0x2CE728F EQ PUSH2 0x2A2 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x309 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x785 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x550E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B7 PUSH2 0x794 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP3 SWAP2 SWAP1 PUSH2 0x5566 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DA PUSH2 0x871 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x55F0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x302 CALLDATASIZE PUSH1 0x4 PUSH2 0x4D93 JUMP JUMPDEST PUSH2 0x949 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x329 PUSH2 0x324 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0xA39 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x555B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x342 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x351 CALLDATASIZE PUSH1 0x4 PUSH2 0x4DDD JUMP JUMPDEST PUSH2 0xAA4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0xAC1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x393 CALLDATASIZE PUSH1 0x4 PUSH2 0x4DDD JUMP JUMPDEST PUSH2 0xAD7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x3B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0xAEC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x3D3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0xAFE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x329 PUSH2 0x3F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4CE3 JUMP JUMPDEST PUSH2 0xB19 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x404 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40D PUSH2 0xC93 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x5D12 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x426 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0xCB0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x43B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0xD10 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0xD1F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x465 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x474 CALLDATASIZE PUSH1 0x4 PUSH2 0x521D JUMP JUMPDEST PUSH2 0xD25 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x485 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0xD7A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0xD80 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x4BE CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0xEBD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E3 PUSH2 0x4DE CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0xECF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH2 0x307 PUSH2 0x4FF CALLDATASIZE PUSH1 0x4 PUSH2 0x4FEE JUMP JUMPDEST PUSH2 0xF1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x510 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x1000 JUMP JUMPDEST PUSH2 0x4E3 PUSH2 0x527 CALLDATASIZE PUSH1 0x4 PUSH2 0x4EDC JUMP JUMPDEST PUSH2 0x108E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x538 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x19CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x55C CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0x19F0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DA PUSH2 0x1A02 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x582 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x591 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E37 JUMP JUMPDEST PUSH2 0x1A90 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x259A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0x25A9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E0 PUSH2 0x25BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP3 SWAP2 SWAP1 PUSH2 0x5CA8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x609 CALLDATASIZE PUSH1 0x4 PUSH2 0x4DDD JUMP JUMPDEST PUSH2 0x25D5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x629 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0x26B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x329 PUSH2 0x649 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0x26F6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x65A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x270B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x66F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DA PUSH2 0x271A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x684 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x329 PUSH2 0x693 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0x27DE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6AD PUSH2 0x28BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5CE6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x28E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x6EC CALLDATASIZE PUSH1 0x4 PUSH2 0x4D23 JUMP JUMPDEST PUSH2 0x290C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x2AAD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x712 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x721 CALLDATASIZE PUSH1 0x4 PUSH2 0x4CAB JUMP JUMPDEST PUSH2 0x2ABC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x732 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x2AD9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x747 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x756 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0x2AE8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x767 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x2B5C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x77C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E0 PUSH2 0x311E JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH4 0xD6D7D525 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xD6D7D525 SWAP1 PUSH2 0x7CA SWAP1 PUSH1 0xA SWAP1 PUSH1 0x4 ADD PUSH2 0x5603 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x7F7 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 0x81B SWAP2 SWAP1 PUSH2 0x4F8D JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP DUP2 ISZERO PUSH2 0x868 JUMPI PUSH1 0x10 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x9F9192B5EDB17356C524E08D9E025C8E2F6307E6EA52FB7968FAA3081F51C3C8 SWAP1 PUSH2 0x85B SWAP1 DUP4 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0x86D JUMP JUMPDEST POP PUSH1 0x10 SLOAD JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x60 SWAP1 PUSH2 0x889 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3138 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH2 0x89E SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3138 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH4 0x355A219B PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xD568866C SWAP1 PUSH2 0x8CF SWAP1 PUSH1 0xA SWAP1 PUSH1 0x4 ADD PUSH2 0x5603 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x8FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x923 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x52AC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x935 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5424 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x97C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A9D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0xA18 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x996 JUMPI POP DUP1 JUMPDEST PUSH2 0x9B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x58DE JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x4 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP6 SWAP1 SSTORE MLOAD SWAP2 SWAP3 SWAP1 SWAP2 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0xA92 SWAP1 DUP7 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAAE PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0xAB9 DUP5 DUP5 DUP5 PUSH2 0x31FD JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAE1 PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0xAB9 DUP5 DUP5 DUP5 PUSH2 0x3436 JUMP JUMPDEST PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB08 PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0xB12 DUP4 DUP4 PUSH2 0x36B1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO PUSH2 0xC3E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 LT ISZERO PUSH2 0xB5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B6C JUMP JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xC3C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x0 NOT DUP2 EQ PUSH2 0xBE9 JUMPI DUP4 DUP2 LT ISZERO PUSH2 0xBC0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x59D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP5 DUP3 SUB SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0xC0F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5877 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP7 DUP6 SUB SWAP1 SSTORE SWAP2 DUP7 AND DUP2 MSTORE KECCAK256 DUP1 SLOAD DUP5 ADD SWAP1 SSTORE JUMPDEST POP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xC81 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x0 SWAP1 PUSH2 0xCAB SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x394F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0xCE8 JUMPI PUSH2 0xCE3 DUP2 PUSH2 0x3A08 JUMP JUMPDEST PUSH2 0xD0A JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x10 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xD4F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A9D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xB SLOAD DUP2 JUMP JUMPDEST PUSH2 0xD88 PUSH2 0x2B5C JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x17E7E58 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 0xDE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDF7 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 0xE1B SWAP2 SWAP1 PUSH2 0x4B98 JUMP JUMPDEST PUSH1 0x11 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0xE55 SWAP1 DUP3 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x11 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 SSTORE SWAP1 MLOAD PUSH32 0xBE641C3FFC44B2D6C184F023FA4ED7BDA4B6FFA71E03B3C98AE0C776DA1F17E7 SWAP1 PUSH2 0xEB1 SWAP1 DUP5 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xEDA PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0xEE4 DUP5 DUP5 PUSH2 0x3A7F JUMP JUMPDEST DUP1 SWAP3 POP DUP2 SWAP4 POP POP POP PUSH2 0xEFA CALLER PUSH1 0x0 PUSH1 0x10 SLOAD PUSH2 0x3D6D JUMP JUMPDEST PUSH2 0xF16 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A66 JUMP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xF46 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5840 JUMP JUMPDEST PUSH2 0xF52 DUP2 DUP4 ADD DUP4 PUSH2 0x5173 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x7 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x8 SWAP1 DUP3 SWAP1 PUSH1 0x9 SWAP1 DUP3 SWAP1 PUSH2 0xF75 SWAP1 PUSH1 0xA SWAP1 PUSH1 0x20 DUP11 ADD SWAP1 PUSH2 0x49AF JUMP JUMPDEST POP DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP9 DUP10 AND PUSH2 0x100 SWAP3 DUP4 EXP SWAP1 DUP2 MUL SWAP1 DUP11 MUL NOT SWAP1 SWAP2 AND OR SWAP1 SWAP2 SSTORE DUP3 SLOAD SWAP8 DUP8 AND SWAP2 DUP2 EXP SWAP2 DUP3 MUL SWAP2 DUP8 MUL NOT SWAP1 SWAP8 AND OR SWAP1 SSTORE DUP2 SLOAD SWAP6 DUP5 AND SWAP5 EXP SWAP4 DUP5 MUL SWAP4 DUP4 MUL NOT SWAP1 SWAP5 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP3 SSTORE POP PUSH1 0x7 SLOAD AND PUSH2 0xFE5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x59AB JUMP JUMPDEST POP POP PUSH1 0x11 DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF NOT AND PUSH4 0x12E687C0 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x102B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5AD2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1099 PUSH2 0x4A29 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP9 DUP2 LT ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP11 DUP11 DUP4 DUP2 DUP2 LT PUSH2 0x10B2 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x10C7 SWAP2 SWAP1 PUSH2 0x535B JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 ADD MLOAD ISZERO DUP1 ISZERO PUSH2 0x10DE JUMPI POP PUSH1 0xA DUP2 PUSH1 0xFF AND LT JUMPDEST ISZERO PUSH2 0x10F3 JUMPI PUSH2 0x10EB PUSH2 0x2B5C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP5 ADD MSTORE JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0xA EQ ISZERO PUSH2 0x114D JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x1110 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1122 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x112F SWAP2 SWAP1 PUSH2 0x5286 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x1145 DUP3 DUP3 PUSH2 0x609 DUP7 DUP13 DUP13 PUSH2 0x3EE8 JUMP JUMPDEST POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x1 EQ ISZERO PUSH2 0x11AE JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x116A JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x117C SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1189 SWAP2 SWAP1 PUSH2 0x5286 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x11A4 DUP3 DUP3 PUSH2 0x119F DUP7 DUP13 DUP13 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x3436 JUMP JUMPDEST SWAP8 POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x2 EQ ISZERO PUSH2 0x120E JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x11CB JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x11DD SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x11EA SWAP2 SWAP1 PUSH2 0x5286 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x1205 DUP3 DUP3 PUSH2 0x1200 DUP7 DUP13 DUP13 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x31FD JUMP JUMPDEST POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x3 EQ ISZERO PUSH2 0x1269 JUMPI PUSH1 0x0 DUP1 DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x1229 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x123B SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1248 SWAP2 SWAP1 PUSH2 0x5262 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1260 DUP2 PUSH2 0x125B DUP5 DUP11 DUP11 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x36B1 JUMP JUMPDEST SWAP7 POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x4 EQ ISZERO PUSH2 0x12C6 JUMPI PUSH1 0x0 DUP1 DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x1284 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1296 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x12A3 SWAP2 SWAP1 PUSH2 0x5262 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x12BB DUP2 PUSH2 0x12B6 DUP5 DUP11 DUP11 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x3F10 JUMP JUMPDEST POP POP PUSH1 0x1 DUP4 MSTORE PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x5 EQ ISZERO PUSH2 0x1329 JUMPI PUSH1 0x0 DUP1 DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x12E1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x12F3 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1300 SWAP2 SWAP1 PUSH2 0x5262 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1318 DUP2 PUSH2 0x1313 DUP5 DUP11 DUP11 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x3A7F JUMP JUMPDEST PUSH1 0x1 DUP8 MSTORE SWAP1 SWAP8 POP SWAP6 POP PUSH2 0x1985 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0xB EQ ISZERO PUSH2 0x13C8 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x1346 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1358 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1365 SWAP2 SWAP1 PUSH2 0x4FBA JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP1 PUSH2 0x1376 PUSH2 0x794 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 ISZERO DUP1 PUSH2 0x1384 JUMPI POP DUP2 JUMPDEST DUP1 ISZERO PUSH2 0x138F JUMPI POP DUP4 DUP2 GT JUMPDEST DUP1 ISZERO PUSH2 0x13A2 JUMPI POP DUP3 ISZERO DUP1 PUSH2 0x13A2 JUMPI POP DUP3 DUP2 GT JUMPDEST PUSH2 0x13BE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5C41 JUMP JUMPDEST POP POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x18 EQ ISZERO PUSH2 0x14A7 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP13 DUP13 DUP10 DUP2 DUP2 LT PUSH2 0x13E9 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x13FB SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1408 SWAP2 SWAP1 PUSH2 0x4BB4 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC0A47C93 DUP8 DUP8 DUP8 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x146A SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5522 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1484 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1498 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x14 EQ ISZERO PUSH2 0x152F JUMPI PUSH2 0x1525 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x14C2 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x14D4 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP14 SWAP3 POP DUP13 SWAP2 POP DUP7 SWAP1 POP DUP2 DUP2 LT PUSH2 0x1517 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP8 DUP8 PUSH2 0x401E JUMP JUMPDEST SWAP1 SWAP6 POP SWAP4 POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x15 EQ ISZERO PUSH2 0x159A JUMPI PUSH2 0x1525 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x154A JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x155C SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP10 SWAP3 POP DUP9 SWAP2 POP PUSH2 0x4114 SWAP1 POP JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x16 EQ ISZERO PUSH2 0x1672 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x15B7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x15C9 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x15D6 SWAP2 SWAP1 PUSH2 0x4CE3 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF18D03CC DUP5 CALLER DUP6 PUSH2 0x1619 DUP7 DUP15 DUP15 PUSH2 0x3EE8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1638 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1652 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1666 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x17 EQ ISZERO PUSH2 0x1706 JUMPI PUSH1 0x0 PUSH1 0x60 DUP1 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x168F JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x16A1 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x16AE SWAP2 SWAP1 PUSH2 0x50A1 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xFCA8843 DUP5 CALLER DUP6 DUP6 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1638 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5705 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x1E EQ ISZERO PUSH2 0x17E0 JUMPI PUSH1 0x60 PUSH1 0x0 PUSH2 0x1788 DUP12 DUP12 DUP7 DUP2 DUP2 LT PUSH2 0x1725 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP11 DUP11 DUP8 DUP2 DUP2 LT PUSH2 0x1738 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x174A SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP13 SWAP3 POP DUP12 SWAP2 POP PUSH2 0x4202 SWAP1 POP JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP1 PUSH1 0xFF AND PUSH1 0x1 EQ ISZERO PUSH2 0x17B3 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x17AC SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP7 POP PUSH2 0x17D9 JUMP JUMPDEST DUP1 PUSH1 0xFF AND PUSH1 0x2 EQ ISZERO PUSH2 0x17D9 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x17D3 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP JUMPDEST POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x6 EQ ISZERO PUSH2 0x1908 JUMPI PUSH1 0x0 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x17FA JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x180C SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1819 SWAP2 SWAP1 PUSH2 0x524A JUMP JUMPDEST PUSH1 0x8 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP2 PUSH4 0xDA5139CA SWAP2 AND PUSH2 0x1890 PUSH2 0x1860 DUP6 DUP12 DUP12 PUSH2 0x3EE8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH2 0x43B8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x18B0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18DC 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 0x1900 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP6 POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x7 EQ ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x1922 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1934 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1941 SWAP2 SWAP1 PUSH2 0x524A JUMP JUMPDEST SWAP1 POP PUSH2 0x1981 PUSH2 0x1951 DUP3 DUP9 DUP9 PUSH2 0x3EE8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 PUSH2 0x4451 JUMP JUMPDEST SWAP6 POP POP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x109C JUMP JUMPDEST POP DUP1 MLOAD ISZERO PUSH2 0x19C0 JUMPI PUSH2 0x19A4 CALLER PUSH1 0x0 PUSH1 0x10 SLOAD PUSH2 0x3D6D JUMP JUMPDEST PUSH2 0x19C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A66 JUMP JUMPDEST POP SWAP7 POP SWAP7 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0xA DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH1 0x0 NOT ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1A88 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1A5D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1A88 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A6B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A9A PUSH2 0x794 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1AA5 PUSH2 0x2B5C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1AB2 PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1AE3 PUSH2 0x4A29 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x40 MLOAD PUSH4 0x4FFE34DB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0x4FFE34DB SWAP3 PUSH2 0x1B36 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x550E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B61 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 0x1B85 SWAP2 SWAP1 PUSH2 0x52DE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP13 DUP2 LT ISZERO PUSH2 0x1DAC JUMPI PUSH1 0x0 DUP15 DUP15 DUP4 DUP2 DUP2 LT PUSH2 0x1BA0 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x1BB5 SWAP2 SWAP1 PUSH2 0x4B7C JUMP JUMPDEST SWAP1 POP PUSH2 0x1BC2 DUP2 DUP11 DUP11 PUSH2 0x3D6D JUMP JUMPDEST PUSH2 0x1DA3 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 DUP16 DUP16 DUP7 DUP2 DUP2 LT PUSH2 0x1BEC JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT PUSH2 0x1C10 JUMPI DUP15 DUP15 DUP6 DUP2 DUP2 LT PUSH2 0x1C04 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x1C12 JUMP JUMPDEST DUP1 JUMPDEST SWAP2 POP PUSH2 0x1C1E DUP2 DUP4 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE SWAP1 POP PUSH2 0x1C47 DUP7 DUP4 DUP4 PUSH2 0x43B8 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1C82 PUSH10 0x152D02C7E14AF6800000 PUSH2 0x1C70 DUP14 PUSH2 0x1C6A DUP7 PUSH3 0x1B580 PUSH2 0x44ED JUMP JUMPDEST SWAP1 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x1C77 JUMPI INVALID JUMPDEST DUP9 SWAP2 SWAP1 DIV PUSH1 0x0 PUSH2 0x4451 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x1CA8 SWAP1 DUP3 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE DUP14 AND ISZERO PUSH2 0x1CD2 JUMPI DUP13 PUSH2 0x1CD4 JUMP JUMPDEST DUP14 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8AD4D3FF00DA092C7AD9A573EA4F5F6A3DFFC6712DC06D3F78F49B862297C402 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1D16 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP1 DUP15 AND ISZERO PUSH2 0x1D37 JUMPI DUP14 PUSH2 0x1D39 JUMP JUMPDEST CALLER JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC8E512D8F188CA059984B5853D2BF653DA902696B8512785B182B2C813789A6E DUP5 DUP7 PUSH1 0x40 MLOAD PUSH2 0x1D73 SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x1D85 DUP11 DUP3 PUSH2 0x3A5C JUMP JUMPDEST SWAP10 POP PUSH2 0x1D91 DUP10 DUP4 PUSH2 0x3A5C JUMP JUMPDEST SWAP9 POP PUSH2 0x1D9D DUP9 DUP5 PUSH2 0x3A5C JUMP JUMPDEST SWAP8 POP POP POP POP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1B8A JUMP JUMPDEST POP DUP4 PUSH2 0x1DCA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x58A7 JUMP JUMPDEST PUSH2 0x1DE7 PUSH2 0x1DD6 DUP6 PUSH2 0x4524 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP3 MSTORE PUSH2 0x1E12 PUSH2 0x1DFE DUP5 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x20 DUP5 ADD DUP2 SWAP1 MSTORE DUP4 MLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND SWAP2 DUP5 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH1 0xB SLOAD PUSH2 0x1E56 SWAP1 DUP7 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0xB SSTORE PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xDA5139CA SWAP3 PUSH2 0x1EB1 SWAP3 AND SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1EDD 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 0x1F01 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP1 POP DUP8 PUSH2 0x2396 JUMPI PUSH1 0x40 MLOAD PUSH4 0x4656BFDF PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x8CAD7FBE SWAP1 PUSH2 0x1F54 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x550E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1F80 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 0x1FA4 SWAP2 SWAP1 PUSH2 0x4F71 JUMP JUMPDEST PUSH2 0x1FC0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5BD3 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x2019 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 DUP15 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2033 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2047 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x7 SLOAD PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x71A1FF09 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP16 AND SWAP6 POP PUSH4 0xE343FE12 SWAP5 POP PUSH2 0x2087 SWAP4 DUP2 AND SWAP3 AND SWAP1 ADDRESS SWAP1 DUP8 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x56D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20B4 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 0x20D8 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST POP POP PUSH1 0xC SLOAD PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3DE222BB PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH2 0x219B SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF7888AEC SWAP3 PUSH2 0x2145 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x568D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x215D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2171 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 0x2195 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP1 PUSH2 0x44CA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x21A9 DUP3 DUP5 PUSH2 0x44CA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH3 0x186A0 PUSH2 0x21BD DUP4 PUSH2 0x2710 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x21C4 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF18D03CC PUSH1 0x8 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ADDRESS PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x17E7E58 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 0x2266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x227A 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 0x229E SWAP2 SWAP1 PUSH2 0x4B98 JUMP JUMPDEST DUP6 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22BE SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x22D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22EC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x2320 PUSH2 0x230E PUSH2 0x2309 DUP4 DUP7 PUSH2 0x44CA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x4524 JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 AND PUSH32 0x30A8C4F9AB5AF7E1309CA87C32377D1A83366C5990472DBF9D262450EAE14E38 PUSH2 0x2376 DUP6 DUP6 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH2 0x2386 SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP PUSH2 0x258A JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP2 PUSH4 0xF18D03CC SWAP2 SWAP1 DUP2 AND SWAP1 ADDRESS SWAP1 DUP14 AND ISZERO PUSH2 0x23DE JUMPI DUP13 PUSH2 0x23E0 JUMP JUMPDEST DUP14 JUMPDEST DUP11 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2400 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x241A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x242E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ISZERO PUSH2 0x24D2 JUMPI PUSH1 0x7 SLOAD PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x71A1FF09 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND SWAP4 PUSH4 0xE343FE12 SWAP4 PUSH2 0x247E SWAP4 SWAP2 DUP4 AND SWAP3 AND SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x56D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2497 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x24AB 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 0x24CF SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x252B SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 CALLER SWAP1 ADDRESS SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2545 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2559 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x2569 PUSH2 0x230E DUP3 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x25F8 SWAP1 DUP3 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0xB SLOAD PUSH2 0x261E DUP2 DUP4 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0xB SSTORE PUSH1 0x7 SLOAD PUSH2 0x2639 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP4 DUP7 PUSH2 0x45AF JUMP JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH2 0x264E JUMPI CALLER PUSH2 0x2670 JUMP JUMPDEST PUSH32 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9ED03113DE523CEBFE5E49D5F8E12894B1C0D42CE805990461726444C90EAB87 DUP5 PUSH1 0x40 MLOAD PUSH2 0x26A8 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH2 0x26BE PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0x26C8 DUP3 DUP3 PUSH2 0x3F10 JUMP JUMPDEST PUSH2 0x26D6 CALLER PUSH1 0x0 PUSH1 0x10 SLOAD PUSH2 0x3D6D JUMP JUMPDEST PUSH2 0x26F2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A66 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x60 SWAP1 PUSH2 0x2732 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x46B6 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH2 0x2747 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x46B6 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH4 0x634CE26B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xC699C4D6 SWAP1 PUSH2 0x2778 SWAP1 PUSH1 0xA SWAP1 PUSH1 0x4 ADD PUSH2 0x5603 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2790 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27A4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x27CC SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x52AC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x935 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54A1 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO PUSH2 0x2878 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 LT ISZERO PUSH2 0x2816 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B6C JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EQ PUSH2 0x2876 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x284C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5877 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP6 DUP5 SUB SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP5 ADD SWAP1 SSTORE JUMPDEST POP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xA92 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x11 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL DUP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP4 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x2932 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B07 JUMP JUMPDEST DUP4 TIMESTAMP LT PUSH2 0x2951 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A3E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 DUP2 ADD SWAP1 SWAP3 SSTORE SWAP3 MLOAD SWAP1 SWAP3 PUSH2 0x29CF SWAP3 PUSH2 0x29B4 SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 DUP15 SWAP2 ADD PUSH2 0x557F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x46FD JUMP JUMPDEST DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x29EF SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55D2 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2A11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2A41 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5C71 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP9 SWAP1 SSTORE MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0x2A9C SWAP1 DUP10 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 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 PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x2B12 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A9D JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xCF1D3F17E521C635E0D20B8ACBA94BA170AFC041D0546D46DAFA09D3C9C19EB3 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x2B64 PUSH2 0x4A40 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x11 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV AND PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 TIMESTAMP SUB DUP1 PUSH2 0x2BB5 JUMPI POP POP PUSH2 0x311C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB TIMESTAMP AND PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2BCC PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x2CBE JUMPI DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH4 0x12E687C0 EQ PUSH2 0x2C56 JUMPI PUSH4 0x12E687C0 DUP1 DUP5 MSTORE PUSH1 0x40 MLOAD PUSH32 0x33AF5CE86E8438EFF54589F85332916444457DFA8685493FBD579B809097026B SWAP2 PUSH2 0x2C4D SWAP2 PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP3 SWAP1 PUSH2 0x57ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP POP DUP1 MLOAD PUSH1 0x11 DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF NOT SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 DUP5 AND OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL SWAP4 SWAP1 SWAP5 AND SWAP3 SWAP1 SWAP3 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SSTORE PUSH2 0x311C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2CC9 PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV DUP2 AND PUSH1 0x20 DUP4 ADD MSTORE DUP7 MLOAD DUP6 MLOAD PUSH8 0xDE0B6B3A7640000 SWAP3 PUSH2 0x2D1B SWAP3 DUP10 SWAP3 PUSH2 0x1C6A SWAP3 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x2D22 JUMPI INVALID JUMPDEST DIV SWAP3 POP PUSH2 0x2D42 PUSH2 0x2D31 DUP5 PUSH2 0x4524 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP1 DUP6 MSTORE PUSH1 0x8 SLOAD DUP3 MLOAD PUSH1 0x40 MLOAD PUSH4 0xACC4623 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x0 SWAP4 PUSH2 0x2E03 SWAP4 SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP4 PUSH4 0x56623118 SWAP4 PUSH2 0x2DAD SWAP4 SWAP3 AND SWAP2 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x579E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DD9 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 0x2DFD SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP1 PUSH2 0x3A5C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH3 0x186A0 PUSH2 0x2E17 DUP7 PUSH2 0x2710 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x2E1E JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 PUSH2 0x2E42 DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP4 PUSH2 0x44ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x2E49 JUMPI INVALID JUMPDEST DIV SWAP4 POP PUSH2 0x2E6C PUSH2 0x2E58 DUP6 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x40 DUP11 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP10 ADD MSTORE PUSH2 0x2E9A PUSH2 0x2E86 DUP6 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP4 DUP3 AND DUP5 MUL OR SWAP1 SWAP2 SSTORE DUP8 MLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x20 DUP12 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP2 AND SWAP3 DUP5 AND SWAP3 DUP4 OR DUP5 AND SWAP4 AND SWAP1 SWAP4 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 SWAP1 DUP4 SWAP1 PUSH2 0x2EF9 SWAP1 PUSH8 0xDE0B6B3A7640000 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x2F00 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH8 0x9B6E64A8EC60000 DUP2 LT ISZERO PUSH2 0x2FC2 JUMPI PUSH1 0x0 PUSH8 0x9B6E64A8EC60000 PUSH2 0x2F34 PUSH8 0xDE0B6B3A7640000 PUSH2 0x1C6A DUP4 DUP7 PUSH2 0x44CA JUMP JUMPDEST DUP2 PUSH2 0x2F3B JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 PUSH2 0x2F69 PUSH2 0x2F51 DUP12 PUSH2 0x1C6A DUP6 DUP1 PUSH2 0x44ED JUMP JUMPDEST PUSH17 0x54A2B63D65D79D094ABB66880000000000 SWAP1 PUSH2 0x3A5C JUMP JUMPDEST DUP12 MLOAD SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2F94 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH17 0x54A2B63D65D79D094ABB66880000000000 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x2F9B JUMPI INVALID JUMPDEST DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP1 DUP13 MSTORE PUSH4 0x4B9A1F0 GT ISZERO PUSH2 0x2FBB JUMPI PUSH4 0x4B9A1F0 DUP12 MSTORE JUMPDEST POP POP PUSH2 0x3073 JUMP JUMPDEST PUSH8 0xB1A2BC2EC500000 DUP2 GT ISZERO PUSH2 0x3073 JUMPI PUSH1 0x0 PUSH8 0x2C68AF0BB140000 PUSH2 0x2FFB PUSH8 0xDE0B6B3A7640000 PUSH2 0x1C6A DUP6 PUSH8 0xB1A2BC2EC500000 PUSH2 0x44CA JUMP JUMPDEST DUP2 PUSH2 0x3002 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 PUSH2 0x3018 PUSH2 0x2F51 DUP12 PUSH2 0x1C6A DUP6 DUP1 PUSH2 0x44ED JUMP JUMPDEST DUP12 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH17 0x54A2B63D65D79D094ABB66880000000000 SWAP1 PUSH2 0x3046 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP5 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x304D JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH5 0x49D4824600 DUP2 GT ISZERO PUSH2 0x3065 JUMPI POP PUSH5 0x49D4824600 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP12 MSTORE POP POP JUMPDEST DUP9 MLOAD PUSH1 0x40 MLOAD PUSH32 0x33AF5CE86E8438EFF54589F85332916444457DFA8685493FBD579B809097026B SWAP2 PUSH2 0x30A9 SWAP2 DUP10 SWAP2 DUP10 SWAP2 DUP7 SWAP1 PUSH2 0x57ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP DUP7 MLOAD PUSH1 0x11 DUP1 SLOAD PUSH1 0x20 DUP11 ADD MLOAD PUSH1 0x40 SWAP1 SWAP11 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF NOT SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 DUP5 AND OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL SWAP4 SWAP1 SWAP11 AND SWAP3 SWAP1 SWAP3 MUL SWAP9 SWAP1 SWAP9 OR PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SWAP7 SSTORE POP POP POP POP POP POP JUMPDEST JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x6FDDE03 PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP2 PUSH1 0x0 SWAP2 DUP4 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH2 0x317F SWAP2 SWAP1 PUSH2 0x53BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x31BA 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 0x31BF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x31EA JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0x3F3F3F PUSH1 0xE8 SHL DUP2 MSTORE POP PUSH2 0x31F3 JUMP JUMPDEST PUSH2 0x31F3 DUP2 PUSH2 0x4735 JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH2 0x3234 SWAP1 DUP4 PUSH1 0x1 PUSH2 0x489A JUMP JUMPDEST DUP2 MLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x20 SWAP5 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x3292 SWAP1 DUP4 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x8 SLOAD SWAP3 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 SWAP3 PUSH32 0x0 DUP4 AND SWAP3 PUSH4 0xDA5139CA SWAP3 PUSH2 0x3300 SWAP3 SWAP1 SWAP2 AND SWAP1 DUP7 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3318 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x332C 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 0x3350 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x8 SLOAD SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x3378 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP4 DUP9 PUSH2 0x45AF JUMP JUMPDEST PUSH2 0x3394 PUSH2 0x3384 DUP4 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP4 AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP6 PUSH2 0x33C9 JUMPI CALLER PUSH2 0x33EB JUMP JUMPDEST PUSH32 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC8E512D8F188CA059984B5853D2BF653DA902696B8512785B182B2C813789A6E DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x3425 SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3440 PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP1 DUP5 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV DUP2 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x8 SLOAD PUSH1 0xD SLOAD SWAP5 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE SWAP4 SWAP5 SWAP3 SWAP4 PUSH1 0x0 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP5 PUSH4 0xDA5139CA SWAP5 PUSH2 0x34C9 SWAP5 SWAP3 AND SWAP3 AND SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x579E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x34E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x34F5 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 0x3519 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND ADD SWAP1 POP DUP1 ISZERO PUSH2 0x355B JUMPI DUP1 PUSH2 0x354E DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP8 PUSH2 0x44ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x3555 JUMPI INVALID JUMPDEST DIV PUSH2 0x355D JUMP JUMPDEST DUP5 JUMPDEST SWAP4 POP PUSH2 0x3E8 PUSH2 0x3582 PUSH2 0x356E DUP7 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND LT ISZERO PUSH2 0x359D JUMPI PUSH1 0x0 SWAP4 POP POP POP POP PUSH2 0xB12 JUMP JUMPDEST PUSH2 0x35A8 DUP4 DUP7 DUP7 PUSH2 0x490F JUMP JUMPDEST DUP1 MLOAD PUSH1 0xC DUP1 SLOAD PUSH1 0x20 SWAP4 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP1 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3601 SWAP1 DUP6 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x8 SLOAD PUSH2 0x362E SWAP2 AND DUP7 DUP5 DUP10 PUSH2 0x45AF JUMP JUMPDEST DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH2 0x3643 JUMPI CALLER PUSH2 0x3665 JUMP JUMPDEST PUSH32 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x30A8C4F9AB5AF7E1309CA87C32377D1A83366C5990472DBF9D262450EAE14E38 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x369F SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x36BB PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV DUP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x8 SLOAD PUSH1 0xD SLOAD SWAP4 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE SWAP3 SWAP4 PUSH1 0x0 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP5 PUSH4 0xDA5139CA SWAP5 PUSH2 0x3742 SWAP5 SWAP3 AND SWAP3 SWAP2 AND SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x579E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x375A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x376E 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 0x3792 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP3 SWAP1 SWAP3 ADD SWAP3 POP AND PUSH2 0x37B5 DUP6 DUP4 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x37BC JUMPI INVALID JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 DIV SWAP4 POP PUSH2 0x37DB SWAP1 DUP6 PUSH2 0x44CA JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0x37F7 PUSH2 0x1DD6 DUP5 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP3 MSTORE PUSH2 0x380E PUSH2 0x1DFE DUP6 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE PUSH2 0x3E8 GT ISZERO PUSH2 0x383F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B3E JUMP JUMPDEST DUP2 MLOAD PUSH1 0xC DUP1 SLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP1 CALLER SWAP1 PUSH32 0x6E853A5FD6B51D773691F542EBAC8513C9992A51380D4C342031056A64114228 SWAP1 PUSH2 0x38B4 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x3915 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 DUP11 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x392F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3943 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x313CE567 PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH2 0x3996 SWAP2 SWAP1 PUSH2 0x53BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x39D1 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 0x39D6 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x39E9 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST PUSH2 0x39F4 JUMPI PUSH1 0x12 PUSH2 0x31F3 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x31F3 SWAP2 SWAP1 PUSH2 0x5377 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3A3F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55B3 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 DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5974 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH3 0x186A0 PUSH2 0x3A92 DUP6 PUSH1 0x32 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x3A99 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x3AD9 PUSH2 0x3AA9 DUP6 DUP4 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH2 0x4950 JUMP JUMPDEST DUP2 MLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x20 SWAP5 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH2 0x3B2E SWAP1 DUP5 PUSH2 0x3A5C JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 SWAP1 PUSH32 0x3A5151E57D3BC9798E7853034AC52293D1A0E12A2B44725E75B03B21F86477A6 SWAP1 PUSH2 0x3B82 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH2 0x5CD0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xDA5139CA SWAP3 PUSH2 0x3BE2 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 DUP9 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x4 ADD PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3BFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3C0E 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 0x3C32 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP2 POP PUSH2 0x3C3C PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x3E8 GT ISZERO PUSH2 0x3C88 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B3E JUMP JUMPDEST PUSH2 0x3CA5 PUSH2 0x3C94 DUP5 PUSH2 0x4524 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0xC DUP1 SLOAD PUSH1 0x20 DUP6 ADD MLOAD DUP5 AND PUSH1 0x1 PUSH1 0x80 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP2 AND SWAP1 SWAP3 OR SWAP1 SWAP3 AND OR SWAP1 SSTORE PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x3D32 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 DUP12 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3D60 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 PUSH2 0x3D95 JUMPI PUSH1 0x1 SWAP2 POP POP PUSH2 0xB12 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP1 PUSH2 0x3DBE JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0xB12 JUMP JUMPDEST PUSH2 0x3DC6 PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP1 DUP5 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH2 0x3E04 SWAP1 DUP8 SWAP1 PUSH2 0x1C6A SWAP1 DUP8 SWAP1 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x3E0B JUMPI INVALID JUMPDEST PUSH1 0x7 SLOAD SWAP2 SWAP1 DIV SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP2 PUSH4 0x56623118 SWAP2 AND PUSH2 0x3E6B DUP11 PUSH2 0x3E56 JUMPI PUSH3 0x124F8 PUSH2 0x3E5B JUMP JUMPDEST PUSH3 0x12CC8 JUMPDEST PUSH2 0x1C6A DUP9 PUSH6 0x9184E72A000 PUSH2 0x44ED JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E8B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3EA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3EB7 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 0x3EDB SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST LT ISZERO SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 SLT ISZERO PUSH2 0x3F08 JUMPI PUSH1 0x0 NOT DUP5 EQ PUSH2 0x3F01 JUMPI DUP2 PUSH2 0x3F03 JUMP JUMPDEST DUP3 JUMPDEST PUSH2 0xAB9 JUMP JUMPDEST POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3F2A SWAP1 DUP3 PUSH2 0x44CA JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0xB SLOAD PUSH2 0x3F47 SWAP1 DUP3 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0xB SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 CALLER SWAP1 PUSH32 0x8AD4D3FF00DA092C7AD9A573EA4F5F6A3DFFC6712DC06D3F78F49B862297C402 SWAP1 PUSH2 0x3F87 SWAP1 DUP6 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x7 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x3FE8 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4002 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4016 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP10 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x403B SWAP2 SWAP1 PUSH2 0x505A JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH2 0x404E DUP3 DUP10 DUP10 PUSH2 0x3EE8 JUMP JUMPDEST SWAP2 POP PUSH2 0x405B DUP2 DUP10 DUP10 PUSH2 0x3EE8 JUMP JUMPDEST SWAP1 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x2B9446C DUP11 DUP7 CALLER DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40B2 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x40CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x40DE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP 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 0x4103 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP POP POP POP SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4131 SWAP2 SWAP1 PUSH2 0x505A JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x97DA6D30 DUP6 CALLER DUP7 PUSH2 0x4176 DUP8 DUP15 DUP15 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x4181 DUP8 DUP16 DUP16 PUSH2 0x3EE8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x41A1 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x41BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x41CE 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 0x41F2 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4222 SWAP2 SWAP1 PUSH2 0x4C21 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP DUP3 DUP1 ISZERO PUSH2 0x4237 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x4265 JUMPI DUP4 DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x424F SWAP3 SWAP2 SWAP1 PUSH2 0x53DB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP4 POP PUSH2 0x42BE JUMP JUMPDEST DUP3 ISZERO DUP1 ISZERO PUSH2 0x4270 JUMPI POP DUP2 JUMPDEST ISZERO PUSH2 0x4288 JUMPI DUP4 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x424F SWAP3 SWAP2 SWAP1 PUSH2 0x53DB JUMP JUMPDEST DUP3 DUP1 ISZERO PUSH2 0x4292 JUMPI POP DUP2 JUMPDEST ISZERO PUSH2 0x42BE JUMPI DUP4 DUP10 DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x42AC SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53FD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP4 POP JUMPDEST PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO DUP1 ISZERO PUSH2 0x4309 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x4325 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A0F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP14 DUP8 PUSH1 0x40 MLOAD PUSH2 0x4342 SWAP2 SWAP1 PUSH2 0x53BF 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 0x437F 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 0x4384 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x43A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x590D JUMP JUMPDEST SWAP13 SWAP2 SWAP12 POP SWAP1 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x0 EQ ISZERO PUSH2 0x43D7 JUMPI POP DUP2 PUSH2 0xB12 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP2 PUSH2 0x43F6 SWAP2 DUP7 SWAP2 AND PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x43FD JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x4441 JUMPI POP DUP3 DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x4437 DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 PUSH2 0x44ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x443E JUMPI INVALID JUMPDEST DIV LT JUMPDEST ISZERO PUSH2 0xB12 JUMPI PUSH2 0xAB9 DUP2 PUSH1 0x1 PUSH2 0x3A5C JUMP JUMPDEST DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x446A JUMPI POP DUP2 PUSH2 0xB12 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP2 PUSH2 0x4489 SWAP2 DUP7 SWAP2 AND PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x4490 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x4441 JUMPI POP DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x4437 DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 PUSH2 0x44ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5811 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0x4508 JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0x4505 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5C0A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP3 GT ISZERO PUSH2 0x454D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x593D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP1 DUP3 SUB PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP5 AND SWAP1 DUP3 AND GT ISZERO PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5811 JUMP JUMPDEST DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5974 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x462B JUMPI PUSH2 0x4607 DUP3 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF7888AEC DUP8 ADDRESS PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2145 SWAP3 SWAP2 SWAP1 PUSH2 0x568D JUMP JUMPDEST DUP4 GT ISZERO PUSH2 0x4626 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B9C JUMP JUMPDEST PUSH2 0x46B0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0xF18D03CC SWAP1 PUSH2 0x467D SWAP1 DUP8 SWAP1 CALLER SWAP1 ADDRESS SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4697 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x46AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95D89B41 PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP2 PUSH1 0x0 SWAP2 DUP4 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH2 0x317F SWAP2 SWAP1 PUSH2 0x53BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH2 0x4722 PUSH2 0xCB0 JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3A3F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53FD JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 DUP3 MLOAD LT PUSH2 0x475B JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4754 SWAP2 SWAP1 PUSH2 0x52AC JUMP JUMPDEST SWAP1 POP PUSH2 0x31F8 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 EQ ISZERO PUSH2 0x487A JUMPI PUSH1 0x0 JUMPDEST PUSH1 0x20 DUP2 PUSH1 0xFF AND LT DUP1 ISZERO PUSH2 0x4797 JUMPI POP DUP3 DUP2 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x4785 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x47A4 JUMPI PUSH1 0x1 ADD PUSH2 0x4768 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH1 0xFF AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x47BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x47EA JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 PUSH1 0xFF AND LT DUP1 ISZERO PUSH2 0x4821 JUMPI POP DUP4 DUP3 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x480F JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x4871 JUMPI DUP4 DUP3 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x4835 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD MLOAD PUSH1 0xF8 SHR PUSH1 0xF8 SHL DUP2 DUP4 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x484F JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x47F2 JUMP JUMPDEST SWAP2 POP PUSH2 0x31F8 SWAP1 POP JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH3 0x3F3F3F PUSH1 0xE8 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x31F8 JUMP JUMPDEST PUSH2 0x48A2 PUSH2 0x4A29 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48AF DUP6 DUP6 DUP6 PUSH2 0x43B8 JUMP JUMPDEST SWAP1 POP PUSH2 0x48CE PUSH2 0x48BD DUP3 PUSH2 0x4524 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP6 MSTORE PUSH2 0x48F9 PUSH2 0x48E5 DUP6 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP7 ADD MSTORE SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x4917 PUSH2 0x4A29 JUMP JUMPDEST PUSH2 0x4923 PUSH2 0x2D31 DUP5 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 MSTORE PUSH2 0x493A PUSH2 0x356E DUP4 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x4958 PUSH2 0x4A29 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4965 DUP6 DUP6 DUP6 PUSH2 0x4451 JUMP JUMPDEST SWAP1 POP PUSH2 0x4984 PUSH2 0x4973 DUP6 PUSH2 0x4524 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP6 MSTORE PUSH2 0x48F9 PUSH2 0x499B DUP3 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x49F0 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x4A1D JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x4A1D JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x4A1D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x4A02 JUMP JUMPDEST POP PUSH2 0x454D SWAP3 SWAP2 POP PUSH2 0x4A60 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 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x454D JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4A61 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xA9E DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x4A91 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4AA7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0xF16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4AD1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x4AE4 PUSH2 0x4ADF DUP3 PUSH2 0x5D8A JUMP JUMPDEST PUSH2 0x5D64 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x4B05 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x4B24 JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4B08 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4B3F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x4B4D PUSH2 0x4ADF DUP3 PUSH2 0x5DA9 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x4B64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4B75 DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5DD8 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4B8D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xB12 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4BA9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xB12 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4BCC JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x4BD7 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x4BE7 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x4BF7 DUP2 PUSH2 0x5E1C JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH2 0x4C07 DUP2 PUSH2 0x5E3F JUMP 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 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x4C38 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP6 MLOAD PUSH2 0x4C43 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD SWAP1 SWAP6 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4C5E JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4C6A DUP9 DUP3 DUP10 ADD PUSH2 0x4B2F JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD MLOAD PUSH2 0x4C7B DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x60 DUP8 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x4C8C DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x80 DUP8 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x4C9D DUP2 PUSH2 0x5E3F JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4CBD JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4CC8 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4CD8 DUP2 PUSH2 0x5E04 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4CF7 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4D02 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4D12 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4D3D JUMPI DUP5 DUP6 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH2 0x4D48 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH2 0x4D58 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4D76 DUP2 PUSH2 0x5E3F JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 PUSH1 0xA0 DUP5 ADD CALLDATALOAD SWAP5 POP PUSH1 0xC0 SWAP1 SWAP4 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4DA7 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4DB2 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4DC2 DUP2 PUSH2 0x5E1C JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x4DD2 DUP2 PUSH2 0x5E1C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4DF1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4DFC DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4D12 DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4E1E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4E29 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4E51 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4E67 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4E73 DUP12 DUP4 DUP13 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP8 POP PUSH1 0x20 DUP11 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4E8B JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4E98 DUP11 DUP3 DUP12 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x4EAC DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x4EBC DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP2 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4ECC DUP2 PUSH2 0x5E1C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4EF4 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4F0A JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x4F16 DUP11 DUP4 DUP12 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4F2E JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x4F3A DUP11 DUP4 DUP12 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4F52 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x4F5F DUP10 DUP3 DUP11 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F82 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xB12 DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4F9F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4FAA DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4FCE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4FD9 DUP2 PUSH2 0x5E1C JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5000 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x5016 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x5029 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x5037 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x5048 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x506F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD PUSH2 0x507A DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x508B DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD PUSH1 0x60 SWAP1 SWAP7 ADD MLOAD SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x50B5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x50C0 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 DUP2 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x50DC JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x50EF JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x50FD PUSH2 0x4ADF DUP3 PUSH2 0x5D8A JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 DUP2 ADD SWAP1 DUP5 DUP7 ADD DUP7 DUP5 MUL DUP7 ADD DUP8 ADD DUP13 LT ISZERO PUSH2 0x5119 JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP6 POP JUMPDEST DUP4 DUP7 LT ISZERO PUSH2 0x5143 JUMPI PUSH2 0x512F DUP13 DUP3 PUSH2 0x4A75 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0x511D JUMP JUMPDEST POP SWAP7 POP POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP3 POP DUP1 DUP4 GT ISZERO PUSH2 0x515B JUMPI DUP4 DUP5 REVERT JUMPDEST POP POP PUSH2 0x5169 DUP7 DUP3 DUP8 ADD PUSH2 0x4AC1 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5188 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x5193 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x51A3 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x51B3 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x51CD JUMPI DUP2 DUP3 REVERT JUMPDEST DUP6 ADD PUSH1 0x1F DUP2 ADD DUP8 SGT PUSH2 0x51DD JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x51EB PUSH2 0x4ADF DUP3 PUSH2 0x5DA9 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP9 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x51FF JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY SWAP1 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x522F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x523A DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4CD8 DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x525B JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5274 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4CD8 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x529A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4DC2 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52BD JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x52D2 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xAB9 DUP5 DUP3 DUP6 ADD PUSH2 0x4B2F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52EF JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x52F9 PUSH1 0x40 PUSH2 0x5D64 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x5304 DUP2 PUSH2 0x5E2A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x5314 DUP2 PUSH2 0x5E2A JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5331 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x534A JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP3 SWAP1 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x536C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xB12 DUP2 PUSH2 0x5E3F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5388 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xB12 DUP2 PUSH2 0x5E3F JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x53AB DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x53D1 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5DD8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x53ED DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x5DD8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD PUSH2 0x540F DUP2 DUP5 PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH18 0x25B0B9B4349026B2B234BAB6902934B9B59 PUSH1 0x75 SHL DUP3 MSTORE DUP5 MLOAD PUSH2 0x5451 DUP2 PUSH1 0x12 DUP6 ADD PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x2F PUSH1 0xF8 SHL PUSH1 0x12 SWAP2 DUP5 ADD SWAP2 DUP3 ADD MSTORE DUP5 MLOAD PUSH2 0x5472 DUP2 PUSH1 0x13 DUP5 ADD PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x2D PUSH1 0xF8 SHL PUSH1 0x13 SWAP3 SWAP1 SWAP2 ADD SWAP2 DUP3 ADD MSTORE DUP4 MLOAD PUSH2 0x5494 DUP2 PUSH1 0x14 DUP5 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x5DD8 JUMP JUMPDEST ADD PUSH1 0x14 ADD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6B6D PUSH1 0xF0 SHL DUP3 MSTORE DUP5 MLOAD PUSH2 0x54BE DUP2 PUSH1 0x2 DUP6 ADD PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x2F PUSH1 0xF8 SHL PUSH1 0x2 SWAP2 DUP5 ADD SWAP2 DUP3 ADD MSTORE DUP5 MLOAD PUSH2 0x54DF DUP2 PUSH1 0x3 DUP5 ADD PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x2D PUSH1 0xF8 SHL PUSH1 0x3 SWAP3 SWAP1 SWAP2 ADD SWAP2 DUP3 ADD MSTORE DUP4 MLOAD PUSH2 0x5501 DUP2 PUSH1 0x4 DUP5 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x5DD8 JUMP JUMPDEST ADD PUSH1 0x4 ADD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP7 DUP8 AND DUP2 MSTORE SWAP5 SWAP1 SWAP6 AND PUSH1 0x20 DUP6 ADD MSTORE SWAP2 ISZERO ISZERO PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0xFF AND PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 ISZERO ISZERO DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP3 SWAP1 SWAP4 AND PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 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 0xB12 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x5393 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP3 DUP6 SLOAD PUSH1 0x1 DUP1 DUP3 AND PUSH1 0x0 DUP2 EQ PUSH2 0x562A JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x5648 JUMPI PUSH2 0x5680 JUMP JUMPDEST PUSH1 0x2 DUP4 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH1 0xFF NOT DUP4 AND PUSH1 0x40 DUP10 ADD MSTORE PUSH1 0x60 DUP9 ADD SWAP4 POP PUSH2 0x5680 JUMP JUMPDEST PUSH1 0x2 DUP4 DIV DUP1 DUP7 MSTORE PUSH2 0x5658 DUP11 PUSH2 0x5DCC JUMP JUMPDEST DUP9 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5676 JUMPI DUP2 SLOAD DUP12 DUP3 ADD PUSH1 0x40 ADD MSTORE SWAP1 DUP5 ADD SWAP1 DUP9 ADD PUSH2 0x565A JUMP JUMPDEST DUP11 ADD PUSH1 0x40 ADD SWAP6 POP POP POP JUMPDEST POP SWAP2 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP3 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP2 MSTORE SWAP4 DUP6 AND PUSH1 0x20 DUP6 ADD MSTORE SWAP2 SWAP1 SWAP4 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x80 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND DUP5 MSTORE PUSH1 0x20 DUP2 DUP9 AND DUP2 DUP7 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP7 ADD MSTORE DUP3 DUP8 MLOAD DUP1 DUP6 MSTORE PUSH1 0xA0 DUP8 ADD SWAP2 POP DUP3 DUP10 ADD SWAP5 POP DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5758 JUMPI DUP6 MLOAD DUP6 AND DUP4 MSTORE SWAP5 DUP4 ADD SWAP5 SWAP2 DUP4 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x573A JUMP JUMPDEST POP POP DUP6 DUP2 SUB PUSH1 0x60 DUP8 ADD MSTORE DUP7 MLOAD DUP1 DUP3 MSTORE SWAP1 DUP3 ADD SWAP4 POP SWAP2 POP DUP1 DUP7 ADD DUP5 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x578F JUMPI DUP2 MLOAD DUP6 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5773 JUMP JUMPDEST POP SWAP3 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE ISZERO ISZERO PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ISZERO ISZERO PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x426F72696E674D6174683A20556E646572666C6F77 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A20616C726561647920696E697469616C697A65640000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x45524332303A206E6F207A65726F2061646472657373 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A20616C6C2061726520736F6C76656E74000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x12D85CDA1A54185A5C8E8818D85B1B0819985A5B1959 PUSH1 0x52 SHL 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 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x25B0B9B434A830B4B91D103130B2103830B4B9 PUSH1 0x69 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20616C6C6F77616E636520746F6F206C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x12D85CDA1A54185A5C8E8818D85B89DD0818D85B1B PUSH1 0x5A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH14 0x115490CC8C0E88115E1C1A5C9959 PUSH1 0x92 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A207573657220696E736F6C76656E7400000000000000 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 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A204F776E65722063616E6E6F7420626520300000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH20 0x4B617368693A2062656C6F77206D696E696D756D PUSH1 0x60 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x45524332303A2062616C616E636520746F6F206C6F77 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A20536B696D20746F6F206D7563680000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A20496E76616C69642073776170706572000000000000 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 PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x4B61736869506169723A2072617465206E6F74206F6B PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20496E76616C6964205369676E61747572650000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB 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 SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x5D36 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x5D4F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0xF16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5D82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x5D9F JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x5DBE JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5DF3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5DDB JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x46B0 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x5E19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x5E19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x5E19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x5E19 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODEHASH XOR 0xCC ADDRESS LOG2 0xE7 0xD4 0xF7 DUP16 0xE6 PUSH4 0x32B88384 PUSH17 0xCDE14DB8273F5A89514BC3B7F5698A9E64 PUSH20 0x6F6C634300060C00330000000000000000000000 ",
              "sourceMap": "29834:33172:0:-:0;;;34626:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5837:9;5911:35;;;;5885:62;5837:9;5885:25;:62::i;:::-;5865:82;;-1:-1:-1;3140:5:0;:18;;-1:-1:-1;;;;;;3140:18:0;3148:10;3140:18;;;;;;3173:44;;3140:5;;3173:44;;3140:5;;3173:44;-1:-1:-1;;;;;;34678:20:0;;;;;;;34725:4;34708:21;;;;34739:5;:18;;-1:-1:-1;;;;;;34739:18:0;34747:10;34739:18;;;29834:33172;;5556:185;5630:7;5155:68;5710:7;5727:4;5666:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5656:78;;;;;;5649:85;;5556:185;;;:::o;186:303:-1:-;;321:2;309:9;300:7;296:23;292:32;289:2;;;-1:-1;;327:12;289:2;103:13;;-1:-1;;;;;1664:54;;1888:55;;1878:2;;-1:-1;;1947:12;1878:2;379:94;283:206;-1:-1;;;283:206::o;856:444::-;687:37;;;1203:2;1188:18;;687:37;;;;-1:-1;;;;;1664:54;1286:2;1271:18;;567:37;1039:2;1024:18;;1010:290::o;:::-;29834:33172:0;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "338": [
                  {
                    "length": 32,
                    "start": 3306
                  }
                ],
                "340": [
                  {
                    "length": 32,
                    "start": 3253
                  }
                ],
                "1983": [
                  {
                    "length": 32,
                    "start": 5142
                  },
                  {
                    "length": 32,
                    "start": 5598
                  },
                  {
                    "length": 32,
                    "start": 5814
                  },
                  {
                    "length": 32,
                    "start": 6185
                  },
                  {
                    "length": 32,
                    "start": 6606
                  },
                  {
                    "length": 32,
                    "start": 6909
                  },
                  {
                    "length": 32,
                    "start": 7798
                  },
                  {
                    "length": 32,
                    "start": 8154
                  },
                  {
                    "length": 32,
                    "start": 8458
                  },
                  {
                    "length": 32,
                    "start": 8649
                  },
                  {
                    "length": 32,
                    "start": 9123
                  },
                  {
                    "length": 32,
                    "start": 9452
                  },
                  {
                    "length": 32,
                    "start": 9808
                  },
                  {
                    "length": 32,
                    "start": 11635
                  },
                  {
                    "length": 32,
                    "start": 12995
                  },
                  {
                    "length": 32,
                    "start": 13259
                  },
                  {
                    "length": 32,
                    "start": 13453
                  },
                  {
                    "length": 32,
                    "start": 13893
                  },
                  {
                    "length": 32,
                    "start": 14085
                  },
                  {
                    "length": 32,
                    "start": 14550
                  },
                  {
                    "length": 32,
                    "start": 15268
                  },
                  {
                    "length": 32,
                    "start": 15603
                  },
                  {
                    "length": 32,
                    "start": 15900
                  },
                  {
                    "length": 32,
                    "start": 16297
                  },
                  {
                    "length": 32,
                    "start": 16479
                  },
                  {
                    "length": 32,
                    "start": 16699
                  },
                  {
                    "length": 32,
                    "start": 17088
                  },
                  {
                    "length": 32,
                    "start": 17851
                  },
                  {
                    "length": 32,
                    "start": 17986
                  }
                ],
                "1985": [
                  {
                    "length": 32,
                    "start": 3468
                  },
                  {
                    "length": 32,
                    "start": 7967
                  },
                  {
                    "length": 32,
                    "start": 8719
                  },
                  {
                    "length": 32,
                    "start": 10474
                  }
                ]
              },
              "linkReferences": {},
              "object": "6080604052600436106102725760003560e01c8063656f3d641161014f5780638da5cb5b116100c1578063d8dfeb451161007a578063d8dfeb45146106f1578063dd62ed3e14610706578063e30c397814610726578063f46901ed1461073b578063f8ba4cff1461075b578063f9557ccb1461077057610272565b80638da5cb5b1461064e57806395d89b4114610663578063a9059cbb14610678578063b27c0e7414610698578063cd446e22146106bc578063d505accf146106d157610272565b80637dc0d1d0116101135780637dc0d1d0146105965780637ecebe00146105ab5780638285ef40146105cb578063860ffea1146105ee578063876467f81461060e5780638cad7fbe1461062e57610272565b8063656f3d64146105195780636b2ace871461052c57806370a082311461054157806374645ff31461056157806376ee101b1461057657610272565b8063313ce567116101e8578063473e3ce7116101ac578063473e3ce714610479578063476343ee1461048e57806348e4163e146104a35780634b8a3529146104c35780634ddf47d4146104f15780634e71e0c81461050457610272565b8063313ce567146103f85780633644e5151461041a57806338d52e0f1461042f5780633ba0b9a9146104445780633f2617cb1461045957610272565b806315294c401161023a57806315294c401461033657806318160ddd146103635780631b51e940146103785780631c9e379b146103985780632317ef67146103b857806323b872dd146103d857610272565b8063017e7e581461027757806302ce728f146102a257806306fdde03146102c5578063078dfbe7146102e7578063095ea7b314610309575b600080fd5b34801561028357600080fd5b5061028c610785565b604051610299919061550e565b60405180910390f35b3480156102ae57600080fd5b506102b7610794565b604051610299929190615566565b3480156102d157600080fd5b506102da610871565b60405161029991906155f0565b3480156102f357600080fd5b50610307610302366004614d93565b610949565b005b34801561031557600080fd5b50610329610324366004614e0c565b610a39565b604051610299919061555b565b34801561034257600080fd5b50610356610351366004614ddd565b610aa4565b6040516102999190615576565b34801561036f57600080fd5b50610356610ac1565b34801561038457600080fd5b50610356610393366004614ddd565b610ad7565b3480156103a457600080fd5b506103566103b3366004614b7c565b610aec565b3480156103c457600080fd5b506103566103d3366004614e0c565b610afe565b3480156103e457600080fd5b506103296103f3366004614ce3565b610b19565b34801561040457600080fd5b5061040d610c93565b6040516102999190615d12565b34801561042657600080fd5b50610356610cb0565b34801561043b57600080fd5b5061028c610d10565b34801561045057600080fd5b50610356610d1f565b34801561046557600080fd5b5061030761047436600461521d565b610d25565b34801561048557600080fd5b50610356610d7a565b34801561049a57600080fd5b50610307610d80565b3480156104af57600080fd5b506103566104be366004614b7c565b610ebd565b3480156104cf57600080fd5b506104e36104de366004614e0c565b610ecf565b604051610299929190615cc2565b6103076104ff366004614fee565b610f1d565b34801561051057600080fd5b50610307611000565b6104e3610527366004614edc565b61108e565b34801561053857600080fd5b5061028c6119cc565b34801561054d57600080fd5b5061035661055c366004614b7c565b6119f0565b34801561056d57600080fd5b506102da611a02565b34801561058257600080fd5b50610307610591366004614e37565b611a90565b3480156105a257600080fd5b5061028c61259a565b3480156105b757600080fd5b506103566105c6366004614b7c565b6125a9565b3480156105d757600080fd5b506105e06125bb565b604051610299929190615ca8565b3480156105fa57600080fd5b50610307610609366004614ddd565b6125d5565b34801561061a57600080fd5b50610307610629366004614e0c565b6126b6565b34801561063a57600080fd5b50610329610649366004614b7c565b6126f6565b34801561065a57600080fd5b5061028c61270b565b34801561066f57600080fd5b506102da61271a565b34801561068457600080fd5b50610329610693366004614e0c565b6127de565b3480156106a457600080fd5b506106ad6128bb565b60405161029993929190615ce6565b3480156106c857600080fd5b5061028c6128e8565b3480156106dd57600080fd5b506103076106ec366004614d23565b61290c565b3480156106fd57600080fd5b5061028c612aad565b34801561071257600080fd5b50610356610721366004614cab565b612abc565b34801561073257600080fd5b5061028c612ad9565b34801561074757600080fd5b50610307610756366004614b7c565b612ae8565b34801561076757600080fd5b50610307612b5c565b34801561077c57600080fd5b506105e061311e565b6005546001600160a01b031681565b60095460405163d6d7d52560e01b815260009182916001600160a01b039091169063d6d7d525906107ca90600a90600401615603565b6040805180830381600087803b1580156107e357600080fd5b505af11580156107f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081b9190614f8d565b909250905081156108685760108190556040517f9f9192b5edb17356c524e08d9e025c8e2f6307e6ea52fb7968faa3081f51c3c89061085b908390615576565b60405180910390a161086d565b506010545b9091565b600754606090610889906001600160a01b0316613138565b60085461089e906001600160a01b0316613138565b60095460405163355a219b60e21b81526001600160a01b039091169063d568866c906108cf90600a90600401615603565b60006040518083038186803b1580156108e757600080fd5b505afa1580156108fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261092391908101906152ac565b60405160200161093593929190615424565b604051602081830303815290604052905090565b6003546001600160a01b0316331461097c5760405162461bcd60e51b815260040161097390615a9d565b60405180910390fd5b8115610a18576001600160a01b0383161515806109965750805b6109b25760405162461bcd60e51b8152600401610973906158de565b6003546040516001600160a01b038086169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0385166001600160a01b031991821617909155600480549091169055610a34565b600480546001600160a01b0319166001600160a01b0385161790555b505050565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a92908690615576565b60405180910390a35060015b92915050565b6000610aae612b5c565b610ab98484846131fd565b949350505050565b600c54600160801b90046001600160801b031690565b6000610ae1612b5c565b610ab9848484613436565b600e6020526000908152604090205481565b6000610b08612b5c565b610b1283836136b1565b9392505050565b60008115610c3e576001600160a01b03841660009081526020819052604090205482811015610b5a5760405162461bcd60e51b815260040161097390615b6c565b836001600160a01b0316856001600160a01b031614610c3c576001600160a01b03851660009081526001602090815260408083203384529091529020546000198114610be95783811015610bc05760405162461bcd60e51b8152600401610973906159d8565b6001600160a01b0386166000908152600160209081526040808320338452909152902084820390555b6001600160a01b038516610c0f5760405162461bcd60e51b815260040161097390615877565b506001600160a01b0380861660009081526020819052604080822086850390559186168152208054840190555b505b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c819190615576565b60405180910390a35060019392505050565b600854600090610cab906001600160a01b031661394f565b905090565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610ce857610ce381613a08565b610d0a565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b6008546001600160a01b031681565b60105481565b6003546001600160a01b03163314610d4f5760405162461bcd60e51b815260040161097390615a9d565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b600b5481565b610d88612b5c565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015610de357600080fd5b505afa158015610df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1b9190614b98565b6011546001600160a01b038216600090815260208190526040902054919250600160801b90046001600160801b031690610e559082613a5c565b6001600160a01b0383166000818152602081905260409081902092909255601180546001600160801b0316905590517fbe641c3ffc44b2d6c184f023fa4ed7bda4b6ffa71e03b3c98ae0c776da1f17e790610eb1908490615576565b60405180910390a25050565b600f6020526000908152604090205481565b600080610eda612b5c565b610ee48484613a7f565b8092508193505050610efa336000601054613d6d565b610f165760405162461bcd60e51b815260040161097390615a66565b9250929050565b6007546001600160a01b031615610f465760405162461bcd60e51b815260040161097390615840565b610f5281830183615173565b805160079060009060089082906009908290610f7590600a9060208a01906149af565b5081546001600160a01b0398891661010092830a908102908a021990911617909155825497871691810a918202918702199097161790558154958416940a93840293830219909416929092179092555060075416610fe55760405162461bcd60e51b8152600401610973906159ab565b50506011805467ffffffffffffffff19166312e687c0179055565b6004546001600160a01b031633811461102b5760405162461bcd60e51b815260040161097390615ad2565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b039092166001600160a01b0319928316179055600480549091169055565b600080611099614a29565b60005b8881101561198e5760008a8a838181106110b257fe5b90506020020160208101906110c7919061535b565b905082602001511580156110de5750600a8160ff16105b156110f3576110eb612b5c565b600160208401525b60ff8116600a141561114d57600080600089898681811061111057fe5b90506020028101906111229190615d20565b81019061112f9190615286565b9250925092506111458282610609868c8c613ee8565b505050611985565b60ff8116600114156111ae57600080600089898681811061116a57fe5b905060200281019061117c9190615d20565b8101906111899190615286565b9250925092506111a4828261119f868c8c613ee8565b613436565b9750505050611985565b60ff81166002141561120e5760008060008989868181106111cb57fe5b90506020028101906111dd9190615d20565b8101906111ea9190615286565b9250925092506112058282611200868c8c613ee8565b6131fd565b50505050611985565b60ff8116600314156112695760008088888581811061122957fe5b905060200281019061123b9190615d20565b8101906112489190615262565b915091506112608161125b848a8a613ee8565b6136b1565b96505050611985565b60ff8116600414156112c65760008088888581811061128457fe5b90506020028101906112969190615d20565b8101906112a39190615262565b915091506112bb816112b6848a8a613ee8565b613f10565b505060018352611985565b60ff811660051415611329576000808888858181106112e157fe5b90506020028101906112f39190615d20565b8101906113009190615262565b9150915061131881611313848a8a613ee8565b613a7f565b600187529097509550611985915050565b60ff8116600b14156113c857600080600089898681811061134657fe5b90506020028101906113589190615d20565b8101906113659190614fba565b925092509250600080611376610794565b915091508415806113845750815b801561138f57508381115b80156113a257508215806113a257508281115b6113be5760405162461bcd60e51b815260040161097390615c41565b5050505050611985565b60ff8116601814156114a7576000806000806000808c8c898181106113e957fe5b90506020028101906113fb9190615d20565b8101906114089190614bb4565b9550955095509550955095507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c0a47c938787878787876040518763ffffffff1660e01b815260040161146a96959493929190615522565b600060405180830381600087803b15801561148457600080fd5b505af1158015611498573d6000803e3d6000fd5b50505050505050505050611985565b60ff81166014141561152f576115258787848181106114c257fe5b90506020028101906114d49190615d20565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c915086905081811061151757fe5b90506020020135878761401e565b9095509350611985565b60ff81166015141561159a5761152587878481811061154a57fe5b905060200281019061155c9190615d20565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992508891506141149050565b60ff8116601614156116725760008060008989868181106115b757fe5b90506020028101906115c99190615d20565b8101906115d69190614ce3565b9250925092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f18d03cc843385611619868e8e613ee8565b6040518563ffffffff1660e01b815260040161163894939291906156a7565b600060405180830381600087803b15801561165257600080fd5b505af1158015611666573d6000803e3d6000fd5b50505050505050611985565b60ff81166017141561170657600060608089898681811061168f57fe5b90506020028101906116a19190615d20565b8101906116ae91906150a1565b9250925092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fca8843843385856040518563ffffffff1660e01b81526004016116389493929190615705565b60ff8116601e14156117e057606060006117888b8b8681811061172557fe5b905060200201358a8a8781811061173857fe5b905060200281019061174a9190615d20565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508b91506142029050565b915091508060ff16600114156117b357818060200190518101906117ac9190615320565b96506117d9565b8060ff16600214156117d957818060200190518101906117d39190615338565b90975095505b5050611985565b60ff8116600614156119085760008787848181106117fa57fe5b905060200281019061180c9190615d20565b810190611819919061524a565b6008549091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163da5139ca9116611890611860858b8b613ee8565b60408051808201909152600d546001600160801b038082168352600160801b9091041660208201529060016143b8565b60016040518463ffffffff1660e01b81526004016118b0939291906157ca565b60206040518083038186803b1580156118c857600080fd5b505afa1580156118dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119009190615320565b955050611985565b60ff81166007141561198557600087878481811061192257fe5b90506020028101906119349190615d20565b810190611941919061524a565b9050611981611951828888613ee8565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906000614451565b9550505b5060010161109c565b508051156119c0576119a4336000601054613d6d565b6119c05760405162461bcd60e51b815260040161097390615a66565b50965096945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006020819052908152604090205481565b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611a885780601f10611a5d57610100808354040283529160200191611a88565b820191906000526020600020905b815481529060010190602001808311611a6b57829003601f168201915b505050505081565b6000611a9a610794565b915050611aa5612b5c565b6000806000611ab2614a29565b5060408051808201909152600d546001600160801b038082168352600160801b909104166020820152611ae3614a29565b600754604051634ffe34db60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692634ffe34db92611b3692919091169060040161550e565b604080518083038186803b158015611b4d57600080fd5b505afa158015611b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8591906152de565b905060005b8c811015611dac5760008e8e83818110611ba057fe5b9050602002016020810190611bb59190614b7c565b9050611bc2818a8a613d6d565b611da3576001600160a01b0381166000908152600f6020526040812054808f8f86818110611bec57fe5b9050602002013511611c10578e8e85818110611c0457fe5b90506020020135611c12565b805b9150611c1e81836144ca565b6001600160a01b0384166000908152600f60205260408120919091559050611c478683836143b8565b90506000611c8269152d02c7e14af6800000611c708d611c6a866201b5806144ed565b906144ed565b81611c7757fe5b889190046000614451565b6001600160a01b0385166000908152600e6020526040902054909150611ca890826144ca565b6001600160a01b038086166000908152600e60205260409020919091558d1615611cd2578c611cd4565b8d5b6001600160a01b0316846001600160a01b03167f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40283604051611d169190615576565b60405180910390a36001600160a01b03808516908e1615611d37578d611d39565b335b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e8486604051611d73929190615cc2565b60405180910390a3611d858a82613a5c565b9950611d918983613a5c565b9850611d9d8884613a5c565b97505050505b50600101611b8a565b5083611dca5760405162461bcd60e51b8152600401610973906158a7565b611de7611dd685614524565b83516001600160801b031690614551565b6001600160801b03168252611e12611dfe84614524565b60208401516001600160801b031690614551565b6001600160801b03908116602084018190528351600d80546001600160801b03191691841691909117909216600160801b909102179055600b54611e5690866144ca565b600b55600854604051636d289ce560e11b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263da5139ca92611eb192169089906001906004016157ca565b60206040518083038186803b158015611ec957600080fd5b505afa158015611edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f019190615320565b90508761239657604051634656bfdf60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638cad7fbe90611f54908c9060040161550e565b60206040518083038186803b158015611f6c57600080fd5b505afa158015611f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa49190614f71565b611fc05760405162461bcd60e51b815260040161097390615bd3565b600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261201992919091169030908e908c906004016156a7565b600060405180830381600087803b15801561203357600080fd5b505af1158015612047573d6000803e3d6000fd5b50506007546008546040516371a1ff0960e11b81526001600160a01b03808f16955063e343fe129450612087938116921690309087908d906004016156d1565b6040805180830381600087803b1580156120a057600080fd5b505af11580156120b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d89190615338565b5050600c54600854604051633de222bb60e21b815260009261219b926001600160801b03909116916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f7888aec92612145929190911690309060040161568d565b60206040518083038186803b15801561215d57600080fd5b505afa158015612171573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121959190615320565b906144ca565b905060006121a982846144ca565b90506000620186a06121bd836127106144ed565b816121c457fe5b0490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f18d03cc600860009054906101000a90046001600160a01b0316307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561226657600080fd5b505afa15801561227a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229e9190614b98565b856040518563ffffffff1660e01b81526004016122be94939291906156a7565b600060405180830381600087803b1580156122d857600080fd5b505af11580156122ec573d6000803e3d6000fd5b5050505061232061230e61230983866144ca90919063ffffffff16565b614524565b600c546001600160801b031690614580565b600c80546001600160801b0319166001600160801b0392909216919091179055306001600160a01b038d167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e3861237685856144ca565b6000604051612386929190615cc2565b60405180910390a350505061258a565b6007546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163f18d03cc919081169030908d16156123de578c6123e0565b8d5b8a6040518563ffffffff1660e01b815260040161240094939291906156a7565b600060405180830381600087803b15801561241a57600080fd5b505af115801561242e573d6000803e3d6000fd5b505050506001600160a01b038916156124d2576007546008546040516371a1ff0960e11b81526001600160a01b03808d169363e343fe129361247e93918316921690339087908d906004016156d1565b6040805180830381600087803b15801561249757600080fd5b505af11580156124ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cf9190615338565b50505b600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261252b9291909116903390309087906004016156a7565b600060405180830381600087803b15801561254557600080fd5b505af1158015612559573d6000803e3d6000fd5b5050505061256961230e82614524565b600c80546001600160801b0319166001600160801b03929092169190911790555b5050505050505050505050505050565b6009546001600160a01b031681565b60026020526000908152604090205481565b600d546001600160801b0380821691600160801b90041682565b6001600160a01b0383166000908152600e60205260409020546125f89082613a5c565b6001600160a01b0384166000908152600e6020526040902055600b5461261e8183613a5c565b600b55600754612639906001600160a01b03168383866145af565b836001600160a01b03168361264e5733612670565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167f9ed03113de523cebfe5e49d5f8e12894b1c0d42ce805990461726444c90eab87846040516126a89190615576565b60405180910390a350505050565b6126be612b5c565b6126c88282613f10565b6126d6336000601054613d6d565b6126f25760405162461bcd60e51b815260040161097390615a66565b5050565b60066020526000908152604090205460ff1681565b6003546001600160a01b031681565b600754606090612732906001600160a01b03166146b6565b600854612747906001600160a01b03166146b6565b60095460405163634ce26b60e11b81526001600160a01b039091169063c699c4d69061277890600a90600401615603565b60006040518083038186803b15801561279057600080fd5b505afa1580156127a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127cc91908101906152ac565b604051602001610935939291906154a1565b600081156128785733600090815260208190526040902054828110156128165760405162461bcd60e51b815260040161097390615b6c565b336001600160a01b03851614612876576001600160a01b03841661284c5760405162461bcd60e51b815260040161097390615877565b3360009081526020819052604080822085840390556001600160a01b038616825290208054840190555b505b826001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a929190615576565b6011546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b0387166129325760405162461bcd60e51b815260040161097390615b07565b8342106129515760405162461bcd60e51b815260040161097390615a3e565b6001600160a01b03871660008181526002602090815260409182902080546001818101909255925190926129cf926129b4927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928e928e928e92918e910161557f565b604051602081830303815290604052805190602001206146fd565b858585604051600081526020016040526040516129ef94939291906155d2565b6020604051602081039080840390855afa158015612a11573d6000803e3d6000fd5b505050602060405103516001600160a01b031614612a415760405162461bcd60e51b815260040161097390615c71565b6001600160a01b038088166000818152600160209081526040808320948b168084529490915290819020889055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590612a9c908990615576565b60405180910390a350505050505050565b6007546001600160a01b031681565b600160209081526000928352604080842090915290825290205481565b6004546001600160a01b031681565b6003546001600160a01b03163314612b125760405162461bcd60e51b815260040161097390615a9d565b600580546001600160a01b0319166001600160a01b0383169081179091556040517fcf1d3f17e521c635e0d20b8acba94ba170afc041d0546d46dafa09d3c9c19eb390600090a250565b612b64614a40565b50604080516060810182526011546001600160401b038082168352600160401b82041660208301819052600160801b9091046001600160801b03169282019290925290420380612bb557505061311c565b6001600160401b0342166020830152612bcc614a29565b5060408051808201909152600d546001600160801b038082168352600160801b9091041660208201819052612cbe5782516001600160401b03166312e687c014612c56576312e687c08084526040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b91612c4d91600091829182906157ed565b60405180910390a15b5050805160118054602084015160409094015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b9390941692909202929092176001600160801b03908116600160801b919092160217905561311c565b600080612cc9614a29565b5060408051808201909152600c546001600160801b038082168352600160801b9091048116602083015286518551670de0b6b3a764000092612d1b928992611c6a9216906001600160401b03166144ed565b81612d2257fe5b049250612d42612d3184614524565b85516001600160801b031690614580565b6001600160801b03168085526008548251604051630acc462360e31b8152600093612e039390926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811693635662311893612dad9392169190889060040161579e565b60206040518083038186803b158015612dc557600080fd5b505afa158015612dd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dfd9190615320565b90613a5c565b90506000620186a0612e17866127106144ed565b81612e1e57fe5b04905081612e4284602001516001600160801b0316836144ed90919063ffffffff16565b81612e4957fe5b049350612e6c612e5885614524565b60408a01516001600160801b031690614580565b6001600160801b03166040890152612e9a612e8685614524565b60208501516001600160801b031690614580565b600c80546001600160801b03908116600160801b9382168402179091558751600d805460208b01516001600160801b031990911692841692831784169316909302919091179091556000908390612ef990670de0b6b3a76400006144ed565b81612f0057fe5b0490506709b6e64a8ec60000811015612fc25760006709b6e64a8ec60000612f34670de0b6b3a7640000611c6a83866144ca565b81612f3b57fe5b0490506000612f69612f518b611c6a85806144ed565b7054a2b63d65d79d094abb6688000000000090613a5c565b8b519091508190612f94906001600160401b03167054a2b63d65d79d094abb668800000000006144ed565b81612f9b57fe5b046001600160401b0316808c526304b9a1f01115612fbb576304b9a1f08b525b5050613073565b670b1a2bc2ec5000008111156130735760006702c68af0bb140000612ffb670de0b6b3a7640000611c6a85670b1a2bc2ec5000006144ca565b8161300257fe5b0490506000613018612f518b611c6a85806144ed565b8b519091506000907054a2b63d65d79d094abb6688000000000090613046906001600160401b0316846144ed565b8161304d57fe5b0490506449d482460081111561306557506449d48246005b6001600160401b03168b5250505b88516040517f33af5ce86e8438eff54589f85332916444457dfa8685493fbd579b809097026b916130a9918991899186906157ed565b60405180910390a1505086516011805460208a01516040909a015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b93909a1692909202989098176001600160801b03908116600160801b9190921602179096555050505050505b565b600c546001600160801b0380821691600160801b90041682565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009183916001600160a01b0386169161317f91906153bf565b600060405180830381855afa9150503d80600081146131ba576040519150601f19603f3d011682016040523d82523d6000602084013e6131bf565b606091505b5091509150816131ea57604051806040016040528060038152602001623f3f3f60e81b8152506131f3565b6131f381614735565b925050505b919050565b60408051808201909152600d546001600160801b038082168352600160801b9091041660208201526000906132349083600161489a565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b0386166000908152600f90925260409091205490915061329290836144ca565b6001600160a01b038086166000908152600f6020526040808220939093556008549251636d289ce560e11b815290927f000000000000000000000000000000000000000000000000000000000000000083169263da5139ca92613300929091169086906001906004016157ca565b60206040518083038186803b15801561331857600080fd5b505afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133509190615320565b600c546008549192506001600160801b031690613378906001600160a01b03168383886145af565b61339461338483614524565b6001600160801b03831690614580565b600c80546001600160801b0319166001600160801b03929092169190911790556001600160a01b038616856133c957336133eb565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167fc8e512d8f188ca059984b5853d2bf653da902696b8512785b182b2c813789a6e8587604051613425929190615cc2565b60405180910390a350509392505050565b6000613440614a29565b50604080518082018252600c546001600160801b03808216808452600160801b90920481166020840152600854600d549451636d289ce560e11b8152939492936000936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169463da5139ca946134c994921692169060019060040161579e565b60206040518083038186803b1580156134e157600080fd5b505afa1580156134f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135199190615320565b83516001600160801b0316019050801561355b578061354e84602001516001600160801b0316876144ed90919063ffffffff16565b8161355557fe5b0461355d565b845b93506103e861358261356e86614524565b60208601516001600160801b031690614580565b6001600160801b0316101561359d5760009350505050610b12565b6135a883868661490f565b8051600c80546020938401516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556001600160a01b03881660009081529081905260409020546136019085613a5c565b6001600160a01b0380891660009081526020819052604090209190915560085461362e91168684896145af565b866001600160a01b0316866136435733613665565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03167f30a8c4f9ab5af7e1309ca87c32377d1a83366c5990472dbf9d262450eae14e38878760405161369f929190615cc2565b60405180910390a35050509392505050565b60006136bb614a29565b50604080518082018252600c546001600160801b038082168352600160801b90910481166020830152600854600d549351636d289ce560e11b815292936000936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169463da5139ca946137429492169291169060019060040161579e565b60206040518083038186803b15801561375a57600080fd5b505afa15801561376e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137929190615320565b825160208401516001600160801b03918216929092019250166137b585836144ed565b816137bc57fe5b3360009081526020819052604090205491900493506137db90856144ca565b336000908152602081905260409020556137f7611dd684614524565b6001600160801b0316825261380e611dfe85614524565b6001600160801b0316602083018190526103e8111561383f5760405162461bcd60e51b815260040161097390615b3e565b8151600c805460208501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556040516001600160a01b0386169033907f6e853a5fd6b51d773691f542ebac8513c9992a51380d4c342031056a64114228906138b49087908990615cc2565b60405180910390a3600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc9261391592919091169030908a9089906004016156a7565b600060405180830381600087803b15801561392f57600080fd5b505af1158015613943573d6000803e3d6000fd5b50505050505092915050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916060916001600160a01b0386169161399691906153bf565b600060405180830381855afa9150503d80600081146139d1576040519150601f19603f3d011682016040523d82523d6000602084013e6139d6565b606091505b50915091508180156139e9575080516020145b6139f45760126131f3565b808060200190518101906131f39190615377565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001613a3f939291906155b3565b604051602081830303815290604052805190602001209050919050565b81810181811015610a9e5760405162461bcd60e51b815260040161097390615974565b60008080620186a0613a928560326144ed565b81613a9957fe5b049050613ad9613aa98583613a5c565b60408051808201909152600d546001600160801b038082168352600160801b909104166020820152906001614950565b8151600d80546020948501516001600160801b03908116600160801b029381166001600160801b03199092169190911716919091179055336000908152600f909252604090912054909350613b2e9084613a5c565b336000818152600f6020526040908190209290925590516001600160a01b03871691907f3a5151e57d3bc9798e7853034ac52293d1a0e12a2b44725e75b03b21f86477a690613b8290889086908990615cd0565b60405180910390a3600854604051636d289ce560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263da5139ca92613be292919091169088906000906004016157ca565b60206040518083038186803b158015613bfa57600080fd5b505afa158015613c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c329190615320565b9150613c3c614a29565b5060408051808201909152600c546001600160801b038082168352600160801b90910416602082018190526103e81115613c885760405162461bcd60e51b815260040161097390615b3e565b613ca5613c9484614524565b82516001600160801b031690614551565b6001600160801b03908116808352600c805460208501518416600160801b026001600160801b0319909116909217909216179055600854604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc92613d3292919091169030908b9089906004016156a7565b600060405180830381600087803b158015613d4c57600080fd5b505af1158015613d60573d6000803e3d6000fd5b5050505050509250929050565b6001600160a01b0383166000908152600f602052604081205480613d95576001915050610b12565b6001600160a01b0385166000908152600e602052604090205480613dbe57600092505050610b12565b613dc6614a29565b5060408051808201909152600d546001600160801b03808216808452600160801b909204166020830181905290613e04908790611c6a9087906144ed565b81613e0b57fe5b600754919004906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163566231189116613e6b8a613e5657620124f8613e5b565b62012cc85b611c6a886509184e72a0006144ed565b60006040518463ffffffff1660e01b8152600401613e8b939291906157ca565b60206040518083038186803b158015613ea357600080fd5b505afa158015613eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613edb9190615320565b1015979650505050505050565b600080841215613f08576000198414613f015781613f03565b825b610ab9565b509192915050565b336000908152600e6020526040902054613f2a90826144ca565b336000908152600e6020526040902055600b54613f4790826144ca565b600b556040516001600160a01b0383169033907f8ad4d3ff00da092c7ad9a573ea4f5f6a3dffc6712dc06d3f78f49b862297c40290613f87908590615576565b60405180910390a3600754604051633c6340f360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f18d03cc92613fe89291909116903090879087906004016156a7565b600060405180830381600087803b15801561400257600080fd5b505af1158015614016573d6000803e3d6000fd5b505050505050565b6000806000806000808980602001905181019061403b919061505a565b935093509350935061404e828989613ee8565b915061405b818989613ee8565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166302b9446c8a86338787876040518763ffffffff1660e01b81526004016140b29594939291906156d1565b60408051808303818588803b1580156140ca57600080fd5b505af11580156140de573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906141039190615338565b955095505050505094509492505050565b60008060008060008088806020019051810190614131919061505a565b93509350935093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166397da6d30853386614176878e8e613ee8565b614181878f8f613ee8565b6040518663ffffffff1660e01b81526004016141a19594939291906156d1565b6040805180830381600087803b1580156141ba57600080fd5b505af11580156141ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f29190615338565b9550955050505050935093915050565b606060008060606000806000898060200190518101906142229190614c21565b94509450945094509450828015614237575081155b1561426557838960405160200161424f9291906153db565b60405160208183030381529060405293506142be565b821580156142705750815b1561428857838860405160200161424f9291906153db565b8280156142925750815b156142be578389896040516020016142ac939291906153fd565b60405160208183030381529060405293505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b03161415801561430957506001600160a01b0385163014155b6143255760405162461bcd60e51b815260040161097390615a0f565b60006060866001600160a01b03168d8760405161434291906153bf565b60006040518083038185875af1925050503d806000811461437f576040519150601f19603f3d011682016040523d82523d6000602084013e614384565b606091505b5091509150816143a65760405162461bcd60e51b81526004016109739061590d565b9c919b50909950505050505050505050565b600083602001516001600160801b0316600014156143d7575081610b12565b602084015184516001600160801b03918216916143f6918691166144ed565b816143fd57fe5b04905081801561444157508284600001516001600160801b031661443786602001516001600160801b0316846144ed90919063ffffffff16565b8161443e57fe5b04105b15610b1257610ab9816001613a5c565b82516000906001600160801b031661446a575081610b12565b835160208501516001600160801b0391821691614489918691166144ed565b8161449057fe5b04905081801561444157508284602001516001600160801b031661443786600001516001600160801b0316846144ed90919063ffffffff16565b80820382811115610a9e5760405162461bcd60e51b815260040161097390615811565b60008115806145085750508082028282828161450557fe5b04145b610a9e5760405162461bcd60e51b815260040161097390615c0a565b60006001600160801b0382111561454d5760405162461bcd60e51b81526004016109739061593d565b5090565b8082036001600160801b038084169082161115610a9e5760405162461bcd60e51b815260040161097390615811565b8181016001600160801b038083169082161015610a9e5760405162461bcd60e51b815260040161097390615974565b801561462b57614607827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f7888aec87306040518363ffffffff1660e01b815260040161214592919061568d565b8311156146265760405162461bcd60e51b815260040161097390615b9c565b6146b0565b604051633c6340f360e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc9061467d9087903390309089906004016156a7565b600060405180830381600087803b15801561469757600080fd5b505af11580156146ab573d6000803e3d6000fd5b505050505b50505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009183916001600160a01b0386169161317f91906153bf565b600060405180604001604052806002815260200161190160f01b815250614722610cb0565b83604051602001613a3f939291906153fd565b6060604082511061475b578180602001905181019061475491906152ac565b90506131f8565b81516020141561487a5760005b60208160ff161080156147975750828160ff168151811061478557fe5b01602001516001600160f81b03191615155b156147a457600101614768565b60608160ff166001600160401b03811180156147bf57600080fd5b506040519080825280601f01601f1916602001820160405280156147ea576020820181803683370190505b509050600091505b60208260ff161080156148215750838260ff168151811061480f57fe5b01602001516001600160f81b03191615155b1561487157838260ff168151811061483557fe5b602001015160f81c60f81b818360ff168151811061484f57fe5b60200101906001600160f81b031916908160001a9053506001909101906147f2565b91506131f89050565b506040805180820190915260038152623f3f3f60e81b60208201526131f8565b6148a2614a29565b60006148af8585856143b8565b90506148ce6148bd82614524565b86516001600160801b031690614551565b6001600160801b031685526148f96148e585614524565b60208701516001600160801b031690614551565b6001600160801b03166020860152939492505050565b614917614a29565b614923612d3184614524565b6001600160801b0316845261493a61356e83614524565b6001600160801b03166020850152509192915050565b614958614a29565b6000614965858585614451565b905061498461497385614524565b86516001600160801b031690614580565b6001600160801b031685526148f961499b82614524565b60208701516001600160801b031690614580565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106149f057805160ff1916838001178555614a1d565b82800160010185558215614a1d579182015b82811115614a1d578251825591602001919060010190614a02565b5061454d929150614a60565b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b5b8082111561454d5760008155600101614a61565b8035610a9e81615e04565b60008083601f840112614a91578182fd5b5081356001600160401b03811115614aa7578182fd5b6020830191508360208083028501011115610f1657600080fd5b600082601f830112614ad1578081fd5b8135614ae4614adf82615d8a565b615d64565b818152915060208083019084810181840286018201871015614b0557600080fd5b60005b84811015614b2457813584529282019290820190600101614b08565b505050505092915050565b600082601f830112614b3f578081fd5b8151614b4d614adf82615da9565b9150808252836020828501011115614b6457600080fd5b614b75816020840160208601615dd8565b5092915050565b600060208284031215614b8d578081fd5b8135610b1281615e04565b600060208284031215614ba9578081fd5b8151610b1281615e04565b60008060008060008060c08789031215614bcc578182fd5b8635614bd781615e04565b95506020870135614be781615e04565b94506040870135614bf781615e1c565b93506060870135614c0781615e3f565b9598949750929560808101359460a0909101359350915050565b600080600080600060a08688031215614c38578283fd5b8551614c4381615e04565b60208701519095506001600160401b03811115614c5e578384fd5b614c6a88828901614b2f565b9450506040860151614c7b81615e1c565b6060870151909350614c8c81615e1c565b6080870151909250614c9d81615e3f565b809150509295509295909350565b60008060408385031215614cbd578182fd5b8235614cc881615e04565b91506020830135614cd881615e04565b809150509250929050565b600080600060608486031215614cf7578081fd5b8335614d0281615e04565b92506020840135614d1281615e04565b929592945050506040919091013590565b600080600080600080600060e0888a031215614d3d578485fd5b8735614d4881615e04565b96506020880135614d5881615e04565b955060408801359450606088013593506080880135614d7681615e3f565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215614da7578081fd5b8335614db281615e04565b92506020840135614dc281615e1c565b91506040840135614dd281615e1c565b809150509250925092565b600080600060608486031215614df1578081fd5b8335614dfc81615e04565b92506020840135614d1281615e1c565b60008060408385031215614e1e578182fd5b8235614e2981615e04565b946020939093013593505050565b600080600080600080600060a0888a031215614e51578081fd5b87356001600160401b0380821115614e67578283fd5b614e738b838c01614a80565b909950975060208a0135915080821115614e8b578283fd5b50614e988a828b01614a80565b9096509450506040880135614eac81615e04565b92506060880135614ebc81615e04565b91506080880135614ecc81615e1c565b8091505092959891949750929550565b60008060008060008060608789031215614ef4578384fd5b86356001600160401b0380821115614f0a578586fd5b614f168a838b01614a80565b90985096506020890135915080821115614f2e578586fd5b614f3a8a838b01614a80565b90965094506040890135915080821115614f52578384fd5b50614f5f89828a01614a80565b979a9699509497509295939492505050565b600060208284031215614f82578081fd5b8151610b1281615e1c565b60008060408385031215614f9f578182fd5b8251614faa81615e1c565b6020939093015192949293505050565b600080600060608486031215614fce578081fd5b8335614fd981615e1c565b95602085013595506040909401359392505050565b60008060208385031215615000578182fd5b82356001600160401b0380821115615016578384fd5b818501915085601f830112615029578384fd5b813581811115615037578485fd5b866020828501011115615048578485fd5b60209290920196919550909350505050565b6000806000806080858703121561506f578182fd5b845161507a81615e04565b602086015190945061508b81615e04565b6040860151606090960151949790965092505050565b6000806000606084860312156150b5578081fd5b83356150c081615e04565b92506020848101356001600160401b03808211156150dc578384fd5b818701915087601f8301126150ef578384fd5b81356150fd614adf82615d8a565b81815284810190848601868402860187018c1015615119578788fd5b8795505b838610156151435761512f8c82614a75565b83526001959095019491860191860161511d565b5096505050604087013592508083111561515b578384fd5b505061516986828701614ac1565b9150509250925092565b60008060008060808587031215615188578182fd5b843561519381615e04565b935060208501356151a381615e04565b925060408501356151b381615e04565b915060608501356001600160401b038111156151cd578182fd5b8501601f810187136151dd578182fd5b80356151eb614adf82615da9565b8181528860208385010111156151ff578384fd5b81602084016020830137908101602001929092525092959194509250565b6000806040838503121561522f578182fd5b823561523a81615e04565b91506020830135614cd881615e1c565b60006020828403121561525b578081fd5b5035919050565b60008060408385031215615274578182fd5b823591506020830135614cd881615e04565b60008060006060848603121561529a578081fd5b833592506020840135614dc281615e04565b6000602082840312156152bd578081fd5b81516001600160401b038111156152d2578182fd5b610ab984828501614b2f565b6000604082840312156152ef578081fd5b6152f96040615d64565b825161530481615e2a565b8152602083015161531481615e2a565b60208201529392505050565b600060208284031215615331578081fd5b5051919050565b6000806040838503121561534a578182fd5b505080516020909101519092909150565b60006020828403121561536c578081fd5b8135610b1281615e3f565b600060208284031215615388578081fd5b8151610b1281615e3f565b600081518084526153ab816020860160208601615dd8565b601f01601f19169290920160200192915050565b600082516153d1818460208701615dd8565b9190910192915050565b600083516153ed818460208801615dd8565b9190910191825250602001919050565b6000845161540f818460208901615dd8565b91909101928352506020820152604001919050565b600071025b0b9b4349026b2b234bab6902934b9b5960751b82528451615451816012850160208901615dd8565b602f60f81b6012918401918201528451615472816013840160208901615dd8565b602d60f81b601392909101918201528351615494816014840160208801615dd8565b0160140195945050505050565b6000616b6d60f01b825284516154be816002850160208901615dd8565b602f60f81b60029184019182015284516154df816003840160208901615dd8565b602d60f81b600392909101918201528351615501816004840160208801615dd8565b0160040195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039687168152949095166020850152911515604084015260ff166060830152608082015260a081019190915260c00190565b901515815260200190565b9115158252602082015260400190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b92835260208301919091526001600160a01b0316604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610b126020830184615393565b6000602080830181845282855460018082166000811461562a576001811461564857615680565b60028304607f16855260ff1983166040890152606088019350615680565b600283048086526156588a615dcc565b885b828110156156765781548b82016040015290840190880161565a565b8a01604001955050505b5091979650505050505050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b60006080820160018060a01b0380881684526020818816818601526080604086015282875180855260a0870191508289019450855b8181101561575857855185168352948301949183019160010161573a565b50508581036060870152865180825290820193509150808601845b8381101561578f57815185529382019390820190600101615773565b50929998505050505050505050565b6001600160a01b039390931683526001600160801b039190911660208301521515604082015260600190565b6001600160a01b0393909316835260208301919091521515604082015260600190565b93845260208401929092526001600160401b03166040830152606082015260800190565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b6020808252601e908201527f4b61736869506169723a20616c726561647920696e697469616c697a65640000604082015260600190565b60208082526016908201527545524332303a206e6f207a65726f206164647265737360501b604082015260600190565b6020808252601a908201527f4b61736869506169723a20616c6c2061726520736f6c76656e74000000000000604082015260600190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b60208082526016908201527512d85cda1a54185a5c8e8818d85b1b0819985a5b195960521b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526013908201527225b0b9b434a830b4b91d103130b2103830b4b960691b604082015260600190565b60208082526018908201527f45524332303a20616c6c6f77616e636520746f6f206c6f770000000000000000604082015260600190565b60208082526015908201527412d85cda1a54185a5c8e8818d85b89dd0818d85b1b605a1b604082015260600190565b6020808252600e908201526d115490cc8c0e88115e1c1a5c995960921b604082015260600190565b60208082526019908201527f4b61736869506169723a207573657220696e736f6c76656e7400000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b60208082526018908201527f45524332303a204f776e65722063616e6e6f7420626520300000000000000000604082015260600190565b6020808252601490820152734b617368693a2062656c6f77206d696e696d756d60601b604082015260600190565b60208082526016908201527545524332303a2062616c616e636520746f6f206c6f7760501b604082015260600190565b60208082526018908201527f4b61736869506169723a20536b696d20746f6f206d7563680000000000000000604082015260600190565b6020808252601a908201527f4b61736869506169723a20496e76616c69642073776170706572000000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b6020808252601690820152754b61736869506169723a2072617465206e6f74206f6b60501b604082015260600190565b60208082526018908201527f45524332303a20496e76616c6964205369676e61747572650000000000000000604082015260600190565b6001600160801b0392831681529116602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b6001600160401b0393841681529190921660208201526001600160801b03909116604082015260600190565b60ff91909116815260200190565b6000808335601e19843603018112615d36578283fd5b8301803591506001600160401b03821115615d4f578283fd5b602001915036819003821315610f1657600080fd5b6040518181016001600160401b0381118282101715615d8257600080fd5b604052919050565b60006001600160401b03821115615d9f578081fd5b5060209081020190565b60006001600160401b03821115615dbe578081fd5b50601f01601f191660200190565b60009081526020902090565b60005b83811015615df3578181015183820152602001615ddb565b838111156146b05750506000910152565b6001600160a01b0381168114615e1957600080fd5b50565b8015158114615e1957600080fd5b6001600160801b0381168114615e1957600080fd5b60ff81168114615e1957600080fdfea26469706673582212203f18cc30a2e7d4f78fe66332b8838470cde14db8273f5a89514bc3b7f5698a9e64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x272 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x656F3D64 GT PUSH2 0x14F JUMPI DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xC1 JUMPI DUP1 PUSH4 0xD8DFEB45 GT PUSH2 0x7A JUMPI DUP1 PUSH4 0xD8DFEB45 EQ PUSH2 0x6F1 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x706 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x726 JUMPI DUP1 PUSH4 0xF46901ED EQ PUSH2 0x73B JUMPI DUP1 PUSH4 0xF8BA4CFF EQ PUSH2 0x75B JUMPI DUP1 PUSH4 0xF9557CCB EQ PUSH2 0x770 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x64E JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x663 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x678 JUMPI DUP1 PUSH4 0xB27C0E74 EQ PUSH2 0x698 JUMPI DUP1 PUSH4 0xCD446E22 EQ PUSH2 0x6BC JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x6D1 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x7DC0D1D0 GT PUSH2 0x113 JUMPI DUP1 PUSH4 0x7DC0D1D0 EQ PUSH2 0x596 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x5AB JUMPI DUP1 PUSH4 0x8285EF40 EQ PUSH2 0x5CB JUMPI DUP1 PUSH4 0x860FFEA1 EQ PUSH2 0x5EE JUMPI DUP1 PUSH4 0x876467F8 EQ PUSH2 0x60E JUMPI DUP1 PUSH4 0x8CAD7FBE EQ PUSH2 0x62E JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x656F3D64 EQ PUSH2 0x519 JUMPI DUP1 PUSH4 0x6B2ACE87 EQ PUSH2 0x52C JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x541 JUMPI DUP1 PUSH4 0x74645FF3 EQ PUSH2 0x561 JUMPI DUP1 PUSH4 0x76EE101B EQ PUSH2 0x576 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x313CE567 GT PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x473E3CE7 GT PUSH2 0x1AC JUMPI DUP1 PUSH4 0x473E3CE7 EQ PUSH2 0x479 JUMPI DUP1 PUSH4 0x476343EE EQ PUSH2 0x48E JUMPI DUP1 PUSH4 0x48E4163E EQ PUSH2 0x4A3 JUMPI DUP1 PUSH4 0x4B8A3529 EQ PUSH2 0x4C3 JUMPI DUP1 PUSH4 0x4DDF47D4 EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x504 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x313CE567 EQ PUSH2 0x3F8 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x41A JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0x42F JUMPI DUP1 PUSH4 0x3BA0B9A9 EQ PUSH2 0x444 JUMPI DUP1 PUSH4 0x3F2617CB EQ PUSH2 0x459 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x15294C40 GT PUSH2 0x23A JUMPI DUP1 PUSH4 0x15294C40 EQ PUSH2 0x336 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x363 JUMPI DUP1 PUSH4 0x1B51E940 EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x1C9E379B EQ PUSH2 0x398 JUMPI DUP1 PUSH4 0x2317EF67 EQ PUSH2 0x3B8 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x3D8 JUMPI PUSH2 0x272 JUMP JUMPDEST DUP1 PUSH4 0x17E7E58 EQ PUSH2 0x277 JUMPI DUP1 PUSH4 0x2CE728F EQ PUSH2 0x2A2 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x309 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x785 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x550E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B7 PUSH2 0x794 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP3 SWAP2 SWAP1 PUSH2 0x5566 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DA PUSH2 0x871 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x55F0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x302 CALLDATASIZE PUSH1 0x4 PUSH2 0x4D93 JUMP JUMPDEST PUSH2 0x949 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x329 PUSH2 0x324 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0xA39 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x555B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x342 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x351 CALLDATASIZE PUSH1 0x4 PUSH2 0x4DDD JUMP JUMPDEST PUSH2 0xAA4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0xAC1 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x393 CALLDATASIZE PUSH1 0x4 PUSH2 0x4DDD JUMP JUMPDEST PUSH2 0xAD7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x3B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0xAEC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x3D3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0xAFE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x329 PUSH2 0x3F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4CE3 JUMP JUMPDEST PUSH2 0xB19 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x404 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40D PUSH2 0xC93 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP2 SWAP1 PUSH2 0x5D12 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x426 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0xCB0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x43B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0xD10 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0xD1F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x465 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x474 CALLDATASIZE PUSH1 0x4 PUSH2 0x521D JUMP JUMPDEST PUSH2 0xD25 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x485 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0xD7A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0xD80 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x4BE CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0xEBD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E3 PUSH2 0x4DE CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0xECF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH2 0x307 PUSH2 0x4FF CALLDATASIZE PUSH1 0x4 PUSH2 0x4FEE JUMP JUMPDEST PUSH2 0xF1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x510 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x1000 JUMP JUMPDEST PUSH2 0x4E3 PUSH2 0x527 CALLDATASIZE PUSH1 0x4 PUSH2 0x4EDC JUMP JUMPDEST PUSH2 0x108E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x538 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x19CC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x55C CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0x19F0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DA PUSH2 0x1A02 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x582 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x591 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E37 JUMP JUMPDEST PUSH2 0x1A90 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x259A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0x25A9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E0 PUSH2 0x25BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP3 SWAP2 SWAP1 PUSH2 0x5CA8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x609 CALLDATASIZE PUSH1 0x4 PUSH2 0x4DDD JUMP JUMPDEST PUSH2 0x25D5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x629 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0x26B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x329 PUSH2 0x649 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0x26F6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x65A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x270B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x66F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DA PUSH2 0x271A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x684 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x329 PUSH2 0x693 CALLDATASIZE PUSH1 0x4 PUSH2 0x4E0C JUMP JUMPDEST PUSH2 0x27DE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6AD PUSH2 0x28BB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x299 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5CE6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x28E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x6EC CALLDATASIZE PUSH1 0x4 PUSH2 0x4D23 JUMP JUMPDEST PUSH2 0x290C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x2AAD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x712 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x356 PUSH2 0x721 CALLDATASIZE PUSH1 0x4 PUSH2 0x4CAB JUMP JUMPDEST PUSH2 0x2ABC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x732 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28C PUSH2 0x2AD9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x747 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x756 CALLDATASIZE PUSH1 0x4 PUSH2 0x4B7C JUMP JUMPDEST PUSH2 0x2AE8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x767 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x2B5C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x77C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E0 PUSH2 0x311E JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH4 0xD6D7D525 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xD6D7D525 SWAP1 PUSH2 0x7CA SWAP1 PUSH1 0xA SWAP1 PUSH1 0x4 ADD PUSH2 0x5603 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x7F7 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 0x81B SWAP2 SWAP1 PUSH2 0x4F8D JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP DUP2 ISZERO PUSH2 0x868 JUMPI PUSH1 0x10 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x9F9192B5EDB17356C524E08D9E025C8E2F6307E6EA52FB7968FAA3081F51C3C8 SWAP1 PUSH2 0x85B SWAP1 DUP4 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0x86D JUMP JUMPDEST POP PUSH1 0x10 SLOAD JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x60 SWAP1 PUSH2 0x889 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3138 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH2 0x89E SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3138 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH4 0x355A219B PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xD568866C SWAP1 PUSH2 0x8CF SWAP1 PUSH1 0xA SWAP1 PUSH1 0x4 ADD PUSH2 0x5603 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x8FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x923 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x52AC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x935 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5424 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x97C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A9D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0xA18 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x996 JUMPI POP DUP1 JUMPDEST PUSH2 0x9B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x58DE JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x4 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP6 SWAP1 SSTORE MLOAD SWAP2 SWAP3 SWAP1 SWAP2 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0xA92 SWAP1 DUP7 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAAE PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0xAB9 DUP5 DUP5 DUP5 PUSH2 0x31FD JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAE1 PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0xAB9 DUP5 DUP5 DUP5 PUSH2 0x3436 JUMP JUMPDEST PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB08 PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0xB12 DUP4 DUP4 PUSH2 0x36B1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO PUSH2 0xC3E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 LT ISZERO PUSH2 0xB5A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B6C JUMP JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xC3C JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x0 NOT DUP2 EQ PUSH2 0xBE9 JUMPI DUP4 DUP2 LT ISZERO PUSH2 0xBC0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x59D8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP5 DUP3 SUB SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0xC0F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5877 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP7 DUP6 SUB SWAP1 SSTORE SWAP2 DUP7 AND DUP2 MSTORE KECCAK256 DUP1 SLOAD DUP5 ADD SWAP1 SSTORE JUMPDEST POP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xC81 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x0 SWAP1 PUSH2 0xCAB SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x394F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 CHAINID PUSH32 0x0 DUP2 EQ PUSH2 0xCE8 JUMPI PUSH2 0xCE3 DUP2 PUSH2 0x3A08 JUMP JUMPDEST PUSH2 0xD0A JUMP JUMPDEST PUSH32 0x0 JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x10 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xD4F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A9D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xB SLOAD DUP2 JUMP JUMPDEST PUSH2 0xD88 PUSH2 0x2B5C JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x17E7E58 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 0xDE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xDF7 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 0xE1B SWAP2 SWAP1 PUSH2 0x4B98 JUMP JUMPDEST PUSH1 0x11 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0xE55 SWAP1 DUP3 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x11 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 SSTORE SWAP1 MLOAD PUSH32 0xBE641C3FFC44B2D6C184F023FA4ED7BDA4B6FFA71E03B3C98AE0C776DA1F17E7 SWAP1 PUSH2 0xEB1 SWAP1 DUP5 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xEDA PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0xEE4 DUP5 DUP5 PUSH2 0x3A7F JUMP JUMPDEST DUP1 SWAP3 POP DUP2 SWAP4 POP POP POP PUSH2 0xEFA CALLER PUSH1 0x0 PUSH1 0x10 SLOAD PUSH2 0x3D6D JUMP JUMPDEST PUSH2 0xF16 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A66 JUMP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xF46 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5840 JUMP JUMPDEST PUSH2 0xF52 DUP2 DUP4 ADD DUP4 PUSH2 0x5173 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x7 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x8 SWAP1 DUP3 SWAP1 PUSH1 0x9 SWAP1 DUP3 SWAP1 PUSH2 0xF75 SWAP1 PUSH1 0xA SWAP1 PUSH1 0x20 DUP11 ADD SWAP1 PUSH2 0x49AF JUMP JUMPDEST POP DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP9 DUP10 AND PUSH2 0x100 SWAP3 DUP4 EXP SWAP1 DUP2 MUL SWAP1 DUP11 MUL NOT SWAP1 SWAP2 AND OR SWAP1 SWAP2 SSTORE DUP3 SLOAD SWAP8 DUP8 AND SWAP2 DUP2 EXP SWAP2 DUP3 MUL SWAP2 DUP8 MUL NOT SWAP1 SWAP8 AND OR SWAP1 SSTORE DUP2 SLOAD SWAP6 DUP5 AND SWAP5 EXP SWAP4 DUP5 MUL SWAP4 DUP4 MUL NOT SWAP1 SWAP5 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP3 SSTORE POP PUSH1 0x7 SLOAD AND PUSH2 0xFE5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x59AB JUMP JUMPDEST POP POP PUSH1 0x11 DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF NOT AND PUSH4 0x12E687C0 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x102B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5AD2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1099 PUSH2 0x4A29 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP9 DUP2 LT ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP11 DUP11 DUP4 DUP2 DUP2 LT PUSH2 0x10B2 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x10C7 SWAP2 SWAP1 PUSH2 0x535B JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 ADD MLOAD ISZERO DUP1 ISZERO PUSH2 0x10DE JUMPI POP PUSH1 0xA DUP2 PUSH1 0xFF AND LT JUMPDEST ISZERO PUSH2 0x10F3 JUMPI PUSH2 0x10EB PUSH2 0x2B5C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP5 ADD MSTORE JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0xA EQ ISZERO PUSH2 0x114D JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x1110 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1122 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x112F SWAP2 SWAP1 PUSH2 0x5286 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x1145 DUP3 DUP3 PUSH2 0x609 DUP7 DUP13 DUP13 PUSH2 0x3EE8 JUMP JUMPDEST POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x1 EQ ISZERO PUSH2 0x11AE JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x116A JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x117C SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1189 SWAP2 SWAP1 PUSH2 0x5286 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x11A4 DUP3 DUP3 PUSH2 0x119F DUP7 DUP13 DUP13 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x3436 JUMP JUMPDEST SWAP8 POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x2 EQ ISZERO PUSH2 0x120E JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x11CB JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x11DD SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x11EA SWAP2 SWAP1 PUSH2 0x5286 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH2 0x1205 DUP3 DUP3 PUSH2 0x1200 DUP7 DUP13 DUP13 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x31FD JUMP JUMPDEST POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x3 EQ ISZERO PUSH2 0x1269 JUMPI PUSH1 0x0 DUP1 DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x1229 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x123B SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1248 SWAP2 SWAP1 PUSH2 0x5262 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1260 DUP2 PUSH2 0x125B DUP5 DUP11 DUP11 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x36B1 JUMP JUMPDEST SWAP7 POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x4 EQ ISZERO PUSH2 0x12C6 JUMPI PUSH1 0x0 DUP1 DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x1284 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1296 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x12A3 SWAP2 SWAP1 PUSH2 0x5262 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x12BB DUP2 PUSH2 0x12B6 DUP5 DUP11 DUP11 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x3F10 JUMP JUMPDEST POP POP PUSH1 0x1 DUP4 MSTORE PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x5 EQ ISZERO PUSH2 0x1329 JUMPI PUSH1 0x0 DUP1 DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x12E1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x12F3 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1300 SWAP2 SWAP1 PUSH2 0x5262 JUMP JUMPDEST SWAP2 POP SWAP2 POP PUSH2 0x1318 DUP2 PUSH2 0x1313 DUP5 DUP11 DUP11 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x3A7F JUMP JUMPDEST PUSH1 0x1 DUP8 MSTORE SWAP1 SWAP8 POP SWAP6 POP PUSH2 0x1985 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0xB EQ ISZERO PUSH2 0x13C8 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x1346 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1358 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1365 SWAP2 SWAP1 PUSH2 0x4FBA JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH1 0x0 DUP1 PUSH2 0x1376 PUSH2 0x794 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 ISZERO DUP1 PUSH2 0x1384 JUMPI POP DUP2 JUMPDEST DUP1 ISZERO PUSH2 0x138F JUMPI POP DUP4 DUP2 GT JUMPDEST DUP1 ISZERO PUSH2 0x13A2 JUMPI POP DUP3 ISZERO DUP1 PUSH2 0x13A2 JUMPI POP DUP3 DUP2 GT JUMPDEST PUSH2 0x13BE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5C41 JUMP JUMPDEST POP POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x18 EQ ISZERO PUSH2 0x14A7 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP13 DUP13 DUP10 DUP2 DUP2 LT PUSH2 0x13E9 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x13FB SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1408 SWAP2 SWAP1 PUSH2 0x4BB4 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xC0A47C93 DUP8 DUP8 DUP8 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x146A SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5522 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1484 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1498 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x14 EQ ISZERO PUSH2 0x152F JUMPI PUSH2 0x1525 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x14C2 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x14D4 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP14 SWAP3 POP DUP13 SWAP2 POP DUP7 SWAP1 POP DUP2 DUP2 LT PUSH2 0x1517 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP8 DUP8 PUSH2 0x401E JUMP JUMPDEST SWAP1 SWAP6 POP SWAP4 POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x15 EQ ISZERO PUSH2 0x159A JUMPI PUSH2 0x1525 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x154A JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x155C SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP10 SWAP3 POP DUP9 SWAP2 POP PUSH2 0x4114 SWAP1 POP JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x16 EQ ISZERO PUSH2 0x1672 JUMPI PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x15B7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x15C9 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x15D6 SWAP2 SWAP1 PUSH2 0x4CE3 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF18D03CC DUP5 CALLER DUP6 PUSH2 0x1619 DUP7 DUP15 DUP15 PUSH2 0x3EE8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1638 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1652 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1666 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x17 EQ ISZERO PUSH2 0x1706 JUMPI PUSH1 0x0 PUSH1 0x60 DUP1 DUP10 DUP10 DUP7 DUP2 DUP2 LT PUSH2 0x168F JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x16A1 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x16AE SWAP2 SWAP1 PUSH2 0x50A1 JUMP JUMPDEST SWAP3 POP SWAP3 POP SWAP3 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xFCA8843 DUP5 CALLER DUP6 DUP6 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1638 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5705 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x1E EQ ISZERO PUSH2 0x17E0 JUMPI PUSH1 0x60 PUSH1 0x0 PUSH2 0x1788 DUP12 DUP12 DUP7 DUP2 DUP2 LT PUSH2 0x1725 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD DUP11 DUP11 DUP8 DUP2 DUP2 LT PUSH2 0x1738 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x174A SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP DUP13 SWAP3 POP DUP12 SWAP2 POP PUSH2 0x4202 SWAP1 POP JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP1 PUSH1 0xFF AND PUSH1 0x1 EQ ISZERO PUSH2 0x17B3 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x17AC SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP7 POP PUSH2 0x17D9 JUMP JUMPDEST DUP1 PUSH1 0xFF AND PUSH1 0x2 EQ ISZERO PUSH2 0x17D9 JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x17D3 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP JUMPDEST POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x6 EQ ISZERO PUSH2 0x1908 JUMPI PUSH1 0x0 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x17FA JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x180C SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1819 SWAP2 SWAP1 PUSH2 0x524A JUMP JUMPDEST PUSH1 0x8 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP2 PUSH4 0xDA5139CA SWAP2 AND PUSH2 0x1890 PUSH2 0x1860 DUP6 DUP12 DUP12 PUSH2 0x3EE8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH2 0x43B8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x18B0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18DC 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 0x1900 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP6 POP POP PUSH2 0x1985 JUMP JUMPDEST PUSH1 0xFF DUP2 AND PUSH1 0x7 EQ ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP8 DUP8 DUP5 DUP2 DUP2 LT PUSH2 0x1922 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x1934 SWAP2 SWAP1 PUSH2 0x5D20 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x1941 SWAP2 SWAP1 PUSH2 0x524A JUMP JUMPDEST SWAP1 POP PUSH2 0x1981 PUSH2 0x1951 DUP3 DUP9 DUP9 PUSH2 0x3EE8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x0 PUSH2 0x4451 JUMP JUMPDEST SWAP6 POP POP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x109C JUMP JUMPDEST POP DUP1 MLOAD ISZERO PUSH2 0x19C0 JUMPI PUSH2 0x19A4 CALLER PUSH1 0x0 PUSH1 0x10 SLOAD PUSH2 0x3D6D JUMP JUMPDEST PUSH2 0x19C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A66 JUMP JUMPDEST POP SWAP7 POP SWAP7 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0xA DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH1 0x0 NOT ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1A88 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1A5D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1A88 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A6B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A9A PUSH2 0x794 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1AA5 PUSH2 0x2B5C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1AB2 PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x1AE3 PUSH2 0x4A29 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x40 MLOAD PUSH4 0x4FFE34DB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0x4FFE34DB SWAP3 PUSH2 0x1B36 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x550E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B61 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 0x1B85 SWAP2 SWAP1 PUSH2 0x52DE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 JUMPDEST DUP13 DUP2 LT ISZERO PUSH2 0x1DAC JUMPI PUSH1 0x0 DUP15 DUP15 DUP4 DUP2 DUP2 LT PUSH2 0x1BA0 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x1BB5 SWAP2 SWAP1 PUSH2 0x4B7C JUMP JUMPDEST SWAP1 POP PUSH2 0x1BC2 DUP2 DUP11 DUP11 PUSH2 0x3D6D JUMP JUMPDEST PUSH2 0x1DA3 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 DUP16 DUP16 DUP7 DUP2 DUP2 LT PUSH2 0x1BEC JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD GT PUSH2 0x1C10 JUMPI DUP15 DUP15 DUP6 DUP2 DUP2 LT PUSH2 0x1C04 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x1C12 JUMP JUMPDEST DUP1 JUMPDEST SWAP2 POP PUSH2 0x1C1E DUP2 DUP4 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE SWAP1 POP PUSH2 0x1C47 DUP7 DUP4 DUP4 PUSH2 0x43B8 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1C82 PUSH10 0x152D02C7E14AF6800000 PUSH2 0x1C70 DUP14 PUSH2 0x1C6A DUP7 PUSH3 0x1B580 PUSH2 0x44ED JUMP JUMPDEST SWAP1 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x1C77 JUMPI INVALID JUMPDEST DUP9 SWAP2 SWAP1 DIV PUSH1 0x0 PUSH2 0x4451 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x1CA8 SWAP1 DUP3 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE DUP14 AND ISZERO PUSH2 0x1CD2 JUMPI DUP13 PUSH2 0x1CD4 JUMP JUMPDEST DUP14 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8AD4D3FF00DA092C7AD9A573EA4F5F6A3DFFC6712DC06D3F78F49B862297C402 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1D16 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP1 DUP15 AND ISZERO PUSH2 0x1D37 JUMPI DUP14 PUSH2 0x1D39 JUMP JUMPDEST CALLER JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC8E512D8F188CA059984B5853D2BF653DA902696B8512785B182B2C813789A6E DUP5 DUP7 PUSH1 0x40 MLOAD PUSH2 0x1D73 SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x1D85 DUP11 DUP3 PUSH2 0x3A5C JUMP JUMPDEST SWAP10 POP PUSH2 0x1D91 DUP10 DUP4 PUSH2 0x3A5C JUMP JUMPDEST SWAP9 POP PUSH2 0x1D9D DUP9 DUP5 PUSH2 0x3A5C JUMP JUMPDEST SWAP8 POP POP POP POP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1B8A JUMP JUMPDEST POP DUP4 PUSH2 0x1DCA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x58A7 JUMP JUMPDEST PUSH2 0x1DE7 PUSH2 0x1DD6 DUP6 PUSH2 0x4524 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP3 MSTORE PUSH2 0x1E12 PUSH2 0x1DFE DUP5 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x20 DUP5 ADD DUP2 SWAP1 MSTORE DUP4 MLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND SWAP2 DUP5 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH1 0xB SLOAD PUSH2 0x1E56 SWAP1 DUP7 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0xB SSTORE PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xDA5139CA SWAP3 PUSH2 0x1EB1 SWAP3 AND SWAP1 DUP10 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1EDD 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 0x1F01 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP1 POP DUP8 PUSH2 0x2396 JUMPI PUSH1 0x40 MLOAD PUSH4 0x4656BFDF PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x8CAD7FBE SWAP1 PUSH2 0x1F54 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x550E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1F80 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 0x1FA4 SWAP2 SWAP1 PUSH2 0x4F71 JUMP JUMPDEST PUSH2 0x1FC0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5BD3 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x2019 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 DUP15 SWAP1 DUP13 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2033 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2047 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x7 SLOAD PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x71A1FF09 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP16 AND SWAP6 POP PUSH4 0xE343FE12 SWAP5 POP PUSH2 0x2087 SWAP4 DUP2 AND SWAP3 AND SWAP1 ADDRESS SWAP1 DUP8 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x56D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20B4 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 0x20D8 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST POP POP PUSH1 0xC SLOAD PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3DE222BB PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH2 0x219B SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF7888AEC SWAP3 PUSH2 0x2145 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x568D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x215D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2171 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 0x2195 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP1 PUSH2 0x44CA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x21A9 DUP3 DUP5 PUSH2 0x44CA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH3 0x186A0 PUSH2 0x21BD DUP4 PUSH2 0x2710 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x21C4 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF18D03CC PUSH1 0x8 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ADDRESS PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x17E7E58 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 0x2266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x227A 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 0x229E SWAP2 SWAP1 PUSH2 0x4B98 JUMP JUMPDEST DUP6 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x22BE SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x22D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x22EC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x2320 PUSH2 0x230E PUSH2 0x2309 DUP4 DUP7 PUSH2 0x44CA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x4524 JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 AND PUSH32 0x30A8C4F9AB5AF7E1309CA87C32377D1A83366C5990472DBF9D262450EAE14E38 PUSH2 0x2376 DUP6 DUP6 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH2 0x2386 SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP PUSH2 0x258A JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP2 PUSH4 0xF18D03CC SWAP2 SWAP1 DUP2 AND SWAP1 ADDRESS SWAP1 DUP14 AND ISZERO PUSH2 0x23DE JUMPI DUP13 PUSH2 0x23E0 JUMP JUMPDEST DUP14 JUMPDEST DUP11 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2400 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x241A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x242E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND ISZERO PUSH2 0x24D2 JUMPI PUSH1 0x7 SLOAD PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x71A1FF09 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND SWAP4 PUSH4 0xE343FE12 SWAP4 PUSH2 0x247E SWAP4 SWAP2 DUP4 AND SWAP3 AND SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x56D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2497 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x24AB 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 0x24CF SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x252B SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 CALLER SWAP1 ADDRESS SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2545 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2559 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x2569 PUSH2 0x230E DUP3 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x25F8 SWAP1 DUP3 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0xB SLOAD PUSH2 0x261E DUP2 DUP4 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0xB SSTORE PUSH1 0x7 SLOAD PUSH2 0x2639 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP4 DUP7 PUSH2 0x45AF JUMP JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH2 0x264E JUMPI CALLER PUSH2 0x2670 JUMP JUMPDEST PUSH32 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9ED03113DE523CEBFE5E49D5F8E12894B1C0D42CE805990461726444C90EAB87 DUP5 PUSH1 0x40 MLOAD PUSH2 0x26A8 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH2 0x26BE PUSH2 0x2B5C JUMP JUMPDEST PUSH2 0x26C8 DUP3 DUP3 PUSH2 0x3F10 JUMP JUMPDEST PUSH2 0x26D6 CALLER PUSH1 0x0 PUSH1 0x10 SLOAD PUSH2 0x3D6D JUMP JUMPDEST PUSH2 0x26F2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A66 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x60 SWAP1 PUSH2 0x2732 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x46B6 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH2 0x2747 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x46B6 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH4 0x634CE26B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xC699C4D6 SWAP1 PUSH2 0x2778 SWAP1 PUSH1 0xA SWAP1 PUSH1 0x4 ADD PUSH2 0x5603 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2790 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27A4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x27CC SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x52AC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x935 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x54A1 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO PUSH2 0x2878 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 LT ISZERO PUSH2 0x2816 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B6C JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND EQ PUSH2 0x2876 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x284C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5877 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP6 DUP5 SUB SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP5 ADD SWAP1 SSTORE JUMPDEST POP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xA92 SWAP2 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x11 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL DUP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP4 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x2932 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B07 JUMP JUMPDEST DUP4 TIMESTAMP LT PUSH2 0x2951 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A3E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 DUP2 ADD SWAP1 SWAP3 SSTORE SWAP3 MLOAD SWAP1 SWAP3 PUSH2 0x29CF SWAP3 PUSH2 0x29B4 SWAP3 PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 SWAP3 DUP15 SWAP3 DUP15 SWAP3 DUP15 SWAP3 SWAP2 DUP15 SWAP2 ADD PUSH2 0x557F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x46FD JUMP JUMPDEST DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x29EF SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55D2 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2A11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2A41 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5C71 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP12 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP9 SWAP1 SSTORE MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0x2A9C SWAP1 DUP10 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 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 PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x2B12 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A9D JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xCF1D3F17E521C635E0D20B8ACBA94BA170AFC041D0546D46DAFA09D3C9C19EB3 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x2B64 PUSH2 0x4A40 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x11 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x40 SHL DUP3 DIV AND PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 TIMESTAMP SUB DUP1 PUSH2 0x2BB5 JUMPI POP POP PUSH2 0x311C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB TIMESTAMP AND PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2BCC PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x2CBE JUMPI DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH4 0x12E687C0 EQ PUSH2 0x2C56 JUMPI PUSH4 0x12E687C0 DUP1 DUP5 MSTORE PUSH1 0x40 MLOAD PUSH32 0x33AF5CE86E8438EFF54589F85332916444457DFA8685493FBD579B809097026B SWAP2 PUSH2 0x2C4D SWAP2 PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP3 SWAP1 PUSH2 0x57ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST POP POP DUP1 MLOAD PUSH1 0x11 DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF NOT SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 DUP5 AND OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL SWAP4 SWAP1 SWAP5 AND SWAP3 SWAP1 SWAP3 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SSTORE PUSH2 0x311C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2CC9 PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV DUP2 AND PUSH1 0x20 DUP4 ADD MSTORE DUP7 MLOAD DUP6 MLOAD PUSH8 0xDE0B6B3A7640000 SWAP3 PUSH2 0x2D1B SWAP3 DUP10 SWAP3 PUSH2 0x1C6A SWAP3 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x2D22 JUMPI INVALID JUMPDEST DIV SWAP3 POP PUSH2 0x2D42 PUSH2 0x2D31 DUP5 PUSH2 0x4524 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP1 DUP6 MSTORE PUSH1 0x8 SLOAD DUP3 MLOAD PUSH1 0x40 MLOAD PUSH4 0xACC4623 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x0 SWAP4 PUSH2 0x2E03 SWAP4 SWAP1 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP4 PUSH4 0x56623118 SWAP4 PUSH2 0x2DAD SWAP4 SWAP3 AND SWAP2 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x579E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DD9 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 0x2DFD SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP1 PUSH2 0x3A5C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH3 0x186A0 PUSH2 0x2E17 DUP7 PUSH2 0x2710 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x2E1E JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 PUSH2 0x2E42 DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP4 PUSH2 0x44ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x2E49 JUMPI INVALID JUMPDEST DIV SWAP4 POP PUSH2 0x2E6C PUSH2 0x2E58 DUP6 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x40 DUP11 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP10 ADD MSTORE PUSH2 0x2E9A PUSH2 0x2E86 DUP6 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP4 DUP3 AND DUP5 MUL OR SWAP1 SWAP2 SSTORE DUP8 MLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x20 DUP12 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP2 AND SWAP3 DUP5 AND SWAP3 DUP4 OR DUP5 AND SWAP4 AND SWAP1 SWAP4 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x0 SWAP1 DUP4 SWAP1 PUSH2 0x2EF9 SWAP1 PUSH8 0xDE0B6B3A7640000 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x2F00 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH8 0x9B6E64A8EC60000 DUP2 LT ISZERO PUSH2 0x2FC2 JUMPI PUSH1 0x0 PUSH8 0x9B6E64A8EC60000 PUSH2 0x2F34 PUSH8 0xDE0B6B3A7640000 PUSH2 0x1C6A DUP4 DUP7 PUSH2 0x44CA JUMP JUMPDEST DUP2 PUSH2 0x2F3B JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 PUSH2 0x2F69 PUSH2 0x2F51 DUP12 PUSH2 0x1C6A DUP6 DUP1 PUSH2 0x44ED JUMP JUMPDEST PUSH17 0x54A2B63D65D79D094ABB66880000000000 SWAP1 PUSH2 0x3A5C JUMP JUMPDEST DUP12 MLOAD SWAP1 SWAP2 POP DUP2 SWAP1 PUSH2 0x2F94 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH17 0x54A2B63D65D79D094ABB66880000000000 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x2F9B JUMPI INVALID JUMPDEST DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP1 DUP13 MSTORE PUSH4 0x4B9A1F0 GT ISZERO PUSH2 0x2FBB JUMPI PUSH4 0x4B9A1F0 DUP12 MSTORE JUMPDEST POP POP PUSH2 0x3073 JUMP JUMPDEST PUSH8 0xB1A2BC2EC500000 DUP2 GT ISZERO PUSH2 0x3073 JUMPI PUSH1 0x0 PUSH8 0x2C68AF0BB140000 PUSH2 0x2FFB PUSH8 0xDE0B6B3A7640000 PUSH2 0x1C6A DUP6 PUSH8 0xB1A2BC2EC500000 PUSH2 0x44CA JUMP JUMPDEST DUP2 PUSH2 0x3002 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 PUSH2 0x3018 PUSH2 0x2F51 DUP12 PUSH2 0x1C6A DUP6 DUP1 PUSH2 0x44ED JUMP JUMPDEST DUP12 MLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH17 0x54A2B63D65D79D094ABB66880000000000 SWAP1 PUSH2 0x3046 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP5 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x304D JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH5 0x49D4824600 DUP2 GT ISZERO PUSH2 0x3065 JUMPI POP PUSH5 0x49D4824600 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP12 MSTORE POP POP JUMPDEST DUP9 MLOAD PUSH1 0x40 MLOAD PUSH32 0x33AF5CE86E8438EFF54589F85332916444457DFA8685493FBD579B809097026B SWAP2 PUSH2 0x30A9 SWAP2 DUP10 SWAP2 DUP10 SWAP2 DUP7 SWAP1 PUSH2 0x57ED JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP DUP7 MLOAD PUSH1 0x11 DUP1 SLOAD PUSH1 0x20 DUP11 ADD MLOAD PUSH1 0x40 SWAP1 SWAP11 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF NOT SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 DUP5 AND OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x40 SHL NOT AND PUSH1 0x1 PUSH1 0x40 SHL SWAP4 SWAP1 SWAP11 AND SWAP3 SWAP1 SWAP3 MUL SWAP9 SWAP1 SWAP9 OR PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL SWAP2 SWAP1 SWAP3 AND MUL OR SWAP1 SWAP7 SSTORE POP POP POP POP POP POP JUMPDEST JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x6FDDE03 PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP2 PUSH1 0x0 SWAP2 DUP4 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH2 0x317F SWAP2 SWAP1 PUSH2 0x53BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x31BA 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 0x31BF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x31EA JUMPI PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0x3F3F3F PUSH1 0xE8 SHL DUP2 MSTORE POP PUSH2 0x31F3 JUMP JUMPDEST PUSH2 0x31F3 DUP2 PUSH2 0x4735 JUMP JUMPDEST SWAP3 POP POP POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP1 PUSH2 0x3234 SWAP1 DUP4 PUSH1 0x1 PUSH2 0x489A JUMP JUMPDEST DUP2 MLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x20 SWAP5 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x3292 SWAP1 DUP4 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x8 SLOAD SWAP3 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 SWAP3 PUSH32 0x0 DUP4 AND SWAP3 PUSH4 0xDA5139CA SWAP3 PUSH2 0x3300 SWAP3 SWAP1 SWAP2 AND SWAP1 DUP7 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3318 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x332C 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 0x3350 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST PUSH1 0xC SLOAD PUSH1 0x8 SLOAD SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x3378 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP4 DUP9 PUSH2 0x45AF JUMP JUMPDEST PUSH2 0x3394 PUSH2 0x3384 DUP4 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP4 AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0xC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND DUP6 PUSH2 0x33C9 JUMPI CALLER PUSH2 0x33EB JUMP JUMPDEST PUSH32 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC8E512D8F188CA059984B5853D2BF653DA902696B8512785B182B2C813789A6E DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x3425 SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3440 PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP1 DUP5 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV DUP2 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x8 SLOAD PUSH1 0xD SLOAD SWAP5 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE SWAP4 SWAP5 SWAP3 SWAP4 PUSH1 0x0 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP5 PUSH4 0xDA5139CA SWAP5 PUSH2 0x34C9 SWAP5 SWAP3 AND SWAP3 AND SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x579E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x34E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x34F5 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 0x3519 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND ADD SWAP1 POP DUP1 ISZERO PUSH2 0x355B JUMPI DUP1 PUSH2 0x354E DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP8 PUSH2 0x44ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x3555 JUMPI INVALID JUMPDEST DIV PUSH2 0x355D JUMP JUMPDEST DUP5 JUMPDEST SWAP4 POP PUSH2 0x3E8 PUSH2 0x3582 PUSH2 0x356E DUP7 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND LT ISZERO PUSH2 0x359D JUMPI PUSH1 0x0 SWAP4 POP POP POP POP PUSH2 0xB12 JUMP JUMPDEST PUSH2 0x35A8 DUP4 DUP7 DUP7 PUSH2 0x490F JUMP JUMPDEST DUP1 MLOAD PUSH1 0xC DUP1 SLOAD PUSH1 0x20 SWAP4 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE SWAP1 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3601 SWAP1 DUP6 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x8 SLOAD PUSH2 0x362E SWAP2 AND DUP7 DUP5 DUP10 PUSH2 0x45AF JUMP JUMPDEST DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH2 0x3643 JUMPI CALLER PUSH2 0x3665 JUMP JUMPDEST PUSH32 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x30A8C4F9AB5AF7E1309CA87C32377D1A83366C5990472DBF9D262450EAE14E38 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH2 0x369F SWAP3 SWAP2 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x36BB PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV DUP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x8 SLOAD PUSH1 0xD SLOAD SWAP4 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE SWAP3 SWAP4 PUSH1 0x0 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP5 PUSH4 0xDA5139CA SWAP5 PUSH2 0x3742 SWAP5 SWAP3 AND SWAP3 SWAP2 AND SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x579E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x375A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x376E 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 0x3792 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP3 SWAP1 SWAP3 ADD SWAP3 POP AND PUSH2 0x37B5 DUP6 DUP4 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x37BC JUMPI INVALID JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 DIV SWAP4 POP PUSH2 0x37DB SWAP1 DUP6 PUSH2 0x44CA JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0x37F7 PUSH2 0x1DD6 DUP5 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP3 MSTORE PUSH2 0x380E PUSH2 0x1DFE DUP6 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE PUSH2 0x3E8 GT ISZERO PUSH2 0x383F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B3E JUMP JUMPDEST DUP2 MLOAD PUSH1 0xC DUP1 SLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP1 CALLER SWAP1 PUSH32 0x6E853A5FD6B51D773691F542EBAC8513C9992A51380D4C342031056A64114228 SWAP1 PUSH2 0x38B4 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH2 0x5CC2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x3915 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 DUP11 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x392F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3943 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x313CE567 PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH2 0x3996 SWAP2 SWAP1 PUSH2 0x53BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x39D1 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 0x39D6 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x39E9 JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST PUSH2 0x39F4 JUMPI PUSH1 0x12 PUSH2 0x31F3 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x31F3 SWAP2 SWAP1 PUSH2 0x5377 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x47E79534A245952E8B16893A336B85A3D9EA9FA8C573F3D803AFB92A79469218 DUP3 ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3A3F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x55B3 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 DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5974 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH3 0x186A0 PUSH2 0x3A92 DUP6 PUSH1 0x32 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x3A99 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x3AD9 PUSH2 0x3AA9 DUP6 DUP4 PUSH2 0x3A5C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD MSTORE SWAP1 PUSH1 0x1 PUSH2 0x4950 JUMP JUMPDEST DUP2 MLOAD PUSH1 0xD DUP1 SLOAD PUSH1 0x20 SWAP5 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH2 0x3B2E SWAP1 DUP5 PUSH2 0x3A5C JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 SWAP1 PUSH32 0x3A5151E57D3BC9798E7853034AC52293D1A0E12A2B44725E75B03B21F86477A6 SWAP1 PUSH2 0x3B82 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH2 0x5CD0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6D289CE5 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xDA5139CA SWAP3 PUSH2 0x3BE2 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 DUP9 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x4 ADD PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3BFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3C0E 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 0x3C32 SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST SWAP2 POP PUSH2 0x3C3C PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV AND PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE PUSH2 0x3E8 GT ISZERO PUSH2 0x3C88 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B3E JUMP JUMPDEST PUSH2 0x3CA5 PUSH2 0x3C94 DUP5 PUSH2 0x4524 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0xC DUP1 SLOAD PUSH1 0x20 DUP6 ADD MLOAD DUP5 AND PUSH1 0x1 PUSH1 0x80 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP2 AND SWAP1 SWAP3 OR SWAP1 SWAP3 AND OR SWAP1 SSTORE PUSH1 0x8 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x3D32 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 DUP12 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3D60 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xF PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 PUSH2 0x3D95 JUMPI PUSH1 0x1 SWAP2 POP POP PUSH2 0xB12 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP1 PUSH2 0x3DBE JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0xB12 JUMP JUMPDEST PUSH2 0x3DC6 PUSH2 0x4A29 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP1 DUP5 MSTORE PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE SWAP1 PUSH2 0x3E04 SWAP1 DUP8 SWAP1 PUSH2 0x1C6A SWAP1 DUP8 SWAP1 PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x3E0B JUMPI INVALID JUMPDEST PUSH1 0x7 SLOAD SWAP2 SWAP1 DIV SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP2 PUSH4 0x56623118 SWAP2 AND PUSH2 0x3E6B DUP11 PUSH2 0x3E56 JUMPI PUSH3 0x124F8 PUSH2 0x3E5B JUMP JUMPDEST PUSH3 0x12CC8 JUMPDEST PUSH2 0x1C6A DUP9 PUSH6 0x9184E72A000 PUSH2 0x44ED JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3E8B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x57CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3EA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3EB7 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 0x3EDB SWAP2 SWAP1 PUSH2 0x5320 JUMP JUMPDEST LT ISZERO SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 SLT ISZERO PUSH2 0x3F08 JUMPI PUSH1 0x0 NOT DUP5 EQ PUSH2 0x3F01 JUMPI DUP2 PUSH2 0x3F03 JUMP JUMPDEST DUP3 JUMPDEST PUSH2 0xAB9 JUMP JUMPDEST POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3F2A SWAP1 DUP3 PUSH2 0x44CA JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0xB SLOAD PUSH2 0x3F47 SWAP1 DUP3 PUSH2 0x44CA JUMP JUMPDEST PUSH1 0xB SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 CALLER SWAP1 PUSH32 0x8AD4D3FF00DA092C7AD9A573EA4F5F6A3DFFC6712DC06D3F78F49B862297C402 SWAP1 PUSH2 0x3F87 SWAP1 DUP6 SWAP1 PUSH2 0x5576 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x7 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 DUP2 AND SWAP3 PUSH4 0xF18D03CC SWAP3 PUSH2 0x3FE8 SWAP3 SWAP2 SWAP1 SWAP2 AND SWAP1 ADDRESS SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4002 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4016 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP10 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x403B SWAP2 SWAP1 PUSH2 0x505A JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH2 0x404E DUP3 DUP10 DUP10 PUSH2 0x3EE8 JUMP JUMPDEST SWAP2 POP PUSH2 0x405B DUP2 DUP10 DUP10 PUSH2 0x3EE8 JUMP JUMPDEST SWAP1 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x2B9446C DUP11 DUP7 CALLER DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40B2 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x40CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x40DE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP 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 0x4103 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP POP POP POP SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP9 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4131 SWAP2 SWAP1 PUSH2 0x505A JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x97DA6D30 DUP6 CALLER DUP7 PUSH2 0x4176 DUP8 DUP15 DUP15 PUSH2 0x3EE8 JUMP JUMPDEST PUSH2 0x4181 DUP8 DUP16 DUP16 PUSH2 0x3EE8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x41A1 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x56D1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x41BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x41CE 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 0x41F2 SWAP2 SWAP1 PUSH2 0x5338 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4222 SWAP2 SWAP1 PUSH2 0x4C21 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP DUP3 DUP1 ISZERO PUSH2 0x4237 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x4265 JUMPI DUP4 DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x424F SWAP3 SWAP2 SWAP1 PUSH2 0x53DB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP4 POP PUSH2 0x42BE JUMP JUMPDEST DUP3 ISZERO DUP1 ISZERO PUSH2 0x4270 JUMPI POP DUP2 JUMPDEST ISZERO PUSH2 0x4288 JUMPI DUP4 DUP9 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x424F SWAP3 SWAP2 SWAP1 PUSH2 0x53DB JUMP JUMPDEST DUP3 DUP1 ISZERO PUSH2 0x4292 JUMPI POP DUP2 JUMPDEST ISZERO PUSH2 0x42BE JUMPI DUP4 DUP10 DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x42AC SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53FD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP4 POP JUMPDEST PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO DUP1 ISZERO PUSH2 0x4309 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND ADDRESS EQ ISZERO JUMPDEST PUSH2 0x4325 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5A0F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP14 DUP8 PUSH1 0x40 MLOAD PUSH2 0x4342 SWAP2 SWAP1 PUSH2 0x53BF 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 0x437F 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 0x4384 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x43A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x590D JUMP JUMPDEST SWAP13 SWAP2 SWAP12 POP SWAP1 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x0 EQ ISZERO PUSH2 0x43D7 JUMPI POP DUP2 PUSH2 0xB12 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP5 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP2 PUSH2 0x43F6 SWAP2 DUP7 SWAP2 AND PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x43FD JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x4441 JUMPI POP DUP3 DUP5 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x4437 DUP7 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 PUSH2 0x44ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x443E JUMPI INVALID JUMPDEST DIV LT JUMPDEST ISZERO PUSH2 0xB12 JUMPI PUSH2 0xAB9 DUP2 PUSH1 0x1 PUSH2 0x3A5C JUMP JUMPDEST DUP3 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x446A JUMPI POP DUP2 PUSH2 0xB12 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 DUP3 AND SWAP2 PUSH2 0x4489 SWAP2 DUP7 SWAP2 AND PUSH2 0x44ED JUMP JUMPDEST DUP2 PUSH2 0x4490 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 DUP1 ISZERO PUSH2 0x4441 JUMPI POP DUP3 DUP5 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x4437 DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 PUSH2 0x44ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5811 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0x4508 JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0x4505 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5C0A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP3 GT ISZERO PUSH2 0x454D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x593D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP1 DUP3 SUB PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP5 AND SWAP1 DUP3 AND GT ISZERO PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5811 JUMP JUMPDEST DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0xA9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5974 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x462B JUMPI PUSH2 0x4607 DUP3 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF7888AEC DUP8 ADDRESS PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2145 SWAP3 SWAP2 SWAP1 PUSH2 0x568D JUMP JUMPDEST DUP4 GT ISZERO PUSH2 0x4626 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x973 SWAP1 PUSH2 0x5B9C JUMP JUMPDEST PUSH2 0x46B0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x3C6340F3 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0xF18D03CC SWAP1 PUSH2 0x467D SWAP1 DUP8 SWAP1 CALLER SWAP1 ADDRESS SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x56A7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4697 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x46AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95D89B41 PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP2 PUSH1 0x0 SWAP2 DUP4 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH2 0x317F SWAP2 SWAP1 PUSH2 0x53BF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH2 0x4722 PUSH2 0xCB0 JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3A3F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x53FD JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 DUP3 MLOAD LT PUSH2 0x475B JUMPI DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4754 SWAP2 SWAP1 PUSH2 0x52AC JUMP JUMPDEST SWAP1 POP PUSH2 0x31F8 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 EQ ISZERO PUSH2 0x487A JUMPI PUSH1 0x0 JUMPDEST PUSH1 0x20 DUP2 PUSH1 0xFF AND LT DUP1 ISZERO PUSH2 0x4797 JUMPI POP DUP3 DUP2 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x4785 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x47A4 JUMPI PUSH1 0x1 ADD PUSH2 0x4768 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH1 0xFF AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x47BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x47EA JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 PUSH1 0xFF AND LT DUP1 ISZERO PUSH2 0x4821 JUMPI POP DUP4 DUP3 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x480F JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x4871 JUMPI DUP4 DUP3 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x4835 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD MLOAD PUSH1 0xF8 SHR PUSH1 0xF8 SHL DUP2 DUP4 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x484F JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x47F2 JUMP JUMPDEST SWAP2 POP PUSH2 0x31F8 SWAP1 POP JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH3 0x3F3F3F PUSH1 0xE8 SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x31F8 JUMP JUMPDEST PUSH2 0x48A2 PUSH2 0x4A29 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48AF DUP6 DUP6 DUP6 PUSH2 0x43B8 JUMP JUMPDEST SWAP1 POP PUSH2 0x48CE PUSH2 0x48BD DUP3 PUSH2 0x4524 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP6 MSTORE PUSH2 0x48F9 PUSH2 0x48E5 DUP6 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4551 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP7 ADD MSTORE SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x4917 PUSH2 0x4A29 JUMP JUMPDEST PUSH2 0x4923 PUSH2 0x2D31 DUP5 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 MSTORE PUSH2 0x493A PUSH2 0x356E DUP4 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x4958 PUSH2 0x4A29 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4965 DUP6 DUP6 DUP6 PUSH2 0x4451 JUMP JUMPDEST SWAP1 POP PUSH2 0x4984 PUSH2 0x4973 DUP6 PUSH2 0x4524 JUMP JUMPDEST DUP7 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP6 MSTORE PUSH2 0x48F9 PUSH2 0x499B DUP3 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x4580 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x49F0 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x4A1D JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x4A1D JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x4A1D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x4A02 JUMP JUMPDEST POP PUSH2 0x454D SWAP3 SWAP2 POP PUSH2 0x4A60 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 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x454D JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4A61 JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xA9E DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x4A91 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4AA7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0xF16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4AD1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x4AE4 PUSH2 0x4ADF DUP3 PUSH2 0x5D8A JUMP JUMPDEST PUSH2 0x5D64 JUMP JUMPDEST DUP2 DUP2 MSTORE SWAP2 POP PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP5 DUP2 ADD DUP2 DUP5 MUL DUP7 ADD DUP3 ADD DUP8 LT ISZERO PUSH2 0x4B05 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x4B24 JUMPI DUP2 CALLDATALOAD DUP5 MSTORE SWAP3 DUP3 ADD SWAP3 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x4B08 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4B3F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x4B4D PUSH2 0x4ADF DUP3 PUSH2 0x5DA9 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x4B64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4B75 DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5DD8 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4B8D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xB12 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4BA9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xB12 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4BCC JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH2 0x4BD7 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH2 0x4BE7 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH2 0x4BF7 DUP2 PUSH2 0x5E1C JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH2 0x4C07 DUP2 PUSH2 0x5E3F JUMP 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 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x4C38 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP6 MLOAD PUSH2 0x4C43 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD SWAP1 SWAP6 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x4C5E JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x4C6A DUP9 DUP3 DUP10 ADD PUSH2 0x4B2F JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 DUP7 ADD MLOAD PUSH2 0x4C7B DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x60 DUP8 ADD MLOAD SWAP1 SWAP4 POP PUSH2 0x4C8C DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x80 DUP8 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x4C9D DUP2 PUSH2 0x5E3F JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4CBD JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4CC8 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4CD8 DUP2 PUSH2 0x5E04 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4CF7 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4D02 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4D12 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4D3D JUMPI DUP5 DUP6 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH2 0x4D48 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH2 0x4D58 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4D76 DUP2 PUSH2 0x5E3F JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 PUSH1 0xA0 DUP5 ADD CALLDATALOAD SWAP5 POP PUSH1 0xC0 SWAP1 SWAP4 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4DA7 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4DB2 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4DC2 DUP2 PUSH2 0x5E1C JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x4DD2 DUP2 PUSH2 0x5E1C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4DF1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4DFC DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4D12 DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4E1E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4E29 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4E51 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4E67 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x4E73 DUP12 DUP4 DUP13 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP8 POP PUSH1 0x20 DUP11 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4E8B JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x4E98 DUP11 DUP3 DUP12 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x4EAC DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x4EBC DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP2 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4ECC DUP2 PUSH2 0x5E1C JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x4EF4 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x4F0A JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x4F16 DUP11 DUP4 DUP12 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP1 SWAP9 POP SWAP7 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4F2E JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x4F3A DUP11 DUP4 DUP12 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x4F52 JUMPI DUP4 DUP5 REVERT JUMPDEST POP PUSH2 0x4F5F DUP10 DUP3 DUP11 ADD PUSH2 0x4A80 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4F82 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xB12 DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4F9F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4FAA DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4FCE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4FD9 DUP2 PUSH2 0x5E1C JUMP JUMPDEST SWAP6 PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 SWAP1 SWAP5 ADD CALLDATALOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5000 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x5016 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x5029 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x5037 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x5048 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x506F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 MLOAD PUSH2 0x507A DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x508B DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD PUSH1 0x60 SWAP1 SWAP7 ADD MLOAD SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x50B5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x50C0 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 DUP2 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x50DC JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x50EF JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x50FD PUSH2 0x4ADF DUP3 PUSH2 0x5D8A JUMP JUMPDEST DUP2 DUP2 MSTORE DUP5 DUP2 ADD SWAP1 DUP5 DUP7 ADD DUP7 DUP5 MUL DUP7 ADD DUP8 ADD DUP13 LT ISZERO PUSH2 0x5119 JUMPI DUP8 DUP9 REVERT JUMPDEST DUP8 SWAP6 POP JUMPDEST DUP4 DUP7 LT ISZERO PUSH2 0x5143 JUMPI PUSH2 0x512F DUP13 DUP3 PUSH2 0x4A75 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP2 DUP7 ADD SWAP2 DUP7 ADD PUSH2 0x511D JUMP JUMPDEST POP SWAP7 POP POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD SWAP3 POP DUP1 DUP4 GT ISZERO PUSH2 0x515B JUMPI DUP4 DUP5 REVERT JUMPDEST POP POP PUSH2 0x5169 DUP7 DUP3 DUP8 ADD PUSH2 0x4AC1 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5188 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x5193 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x51A3 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x51B3 DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x51CD JUMPI DUP2 DUP3 REVERT JUMPDEST DUP6 ADD PUSH1 0x1F DUP2 ADD DUP8 SGT PUSH2 0x51DD JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x51EB PUSH2 0x4ADF DUP3 PUSH2 0x5DA9 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP9 PUSH1 0x20 DUP4 DUP6 ADD ADD GT ISZERO PUSH2 0x51FF JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY SWAP1 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x522F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x523A DUP2 PUSH2 0x5E04 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4CD8 DUP2 PUSH2 0x5E1C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x525B JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x5274 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x4CD8 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x529A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x4DC2 DUP2 PUSH2 0x5E04 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52BD JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x52D2 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xAB9 DUP5 DUP3 DUP6 ADD PUSH2 0x4B2F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x52EF JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x52F9 PUSH1 0x40 PUSH2 0x5D64 JUMP JUMPDEST DUP3 MLOAD PUSH2 0x5304 DUP2 PUSH2 0x5E2A JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x5314 DUP2 PUSH2 0x5E2A JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5331 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x534A JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP3 SWAP1 SWAP2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x536C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xB12 DUP2 PUSH2 0x5E3F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5388 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0xB12 DUP2 PUSH2 0x5E3F JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x53AB DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x53D1 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5DD8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0x53ED DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x5DD8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP5 MLOAD PUSH2 0x540F DUP2 DUP5 PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE POP PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH18 0x25B0B9B4349026B2B234BAB6902934B9B59 PUSH1 0x75 SHL DUP3 MSTORE DUP5 MLOAD PUSH2 0x5451 DUP2 PUSH1 0x12 DUP6 ADD PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x2F PUSH1 0xF8 SHL PUSH1 0x12 SWAP2 DUP5 ADD SWAP2 DUP3 ADD MSTORE DUP5 MLOAD PUSH2 0x5472 DUP2 PUSH1 0x13 DUP5 ADD PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x2D PUSH1 0xF8 SHL PUSH1 0x13 SWAP3 SWAP1 SWAP2 ADD SWAP2 DUP3 ADD MSTORE DUP4 MLOAD PUSH2 0x5494 DUP2 PUSH1 0x14 DUP5 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x5DD8 JUMP JUMPDEST ADD PUSH1 0x14 ADD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6B6D PUSH1 0xF0 SHL DUP3 MSTORE DUP5 MLOAD PUSH2 0x54BE DUP2 PUSH1 0x2 DUP6 ADD PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x2F PUSH1 0xF8 SHL PUSH1 0x2 SWAP2 DUP5 ADD SWAP2 DUP3 ADD MSTORE DUP5 MLOAD PUSH2 0x54DF DUP2 PUSH1 0x3 DUP5 ADD PUSH1 0x20 DUP10 ADD PUSH2 0x5DD8 JUMP JUMPDEST PUSH1 0x2D PUSH1 0xF8 SHL PUSH1 0x3 SWAP3 SWAP1 SWAP2 ADD SWAP2 DUP3 ADD MSTORE DUP4 MLOAD PUSH2 0x5501 DUP2 PUSH1 0x4 DUP5 ADD PUSH1 0x20 DUP9 ADD PUSH2 0x5DD8 JUMP JUMPDEST ADD PUSH1 0x4 ADD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP7 DUP8 AND DUP2 MSTORE SWAP5 SWAP1 SWAP6 AND PUSH1 0x20 DUP6 ADD MSTORE SWAP2 ISZERO ISZERO PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0xFF AND PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 ISZERO ISZERO DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP6 DUP7 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND PUSH1 0x20 DUP8 ADD MSTORE SWAP3 SWAP1 SWAP4 AND PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 ADD SWAP1 JUMP JUMPDEST SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 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 0xB12 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x5393 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 ADD DUP2 DUP5 MSTORE DUP3 DUP6 SLOAD PUSH1 0x1 DUP1 DUP3 AND PUSH1 0x0 DUP2 EQ PUSH2 0x562A JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x5648 JUMPI PUSH2 0x5680 JUMP JUMPDEST PUSH1 0x2 DUP4 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH1 0xFF NOT DUP4 AND PUSH1 0x40 DUP10 ADD MSTORE PUSH1 0x60 DUP9 ADD SWAP4 POP PUSH2 0x5680 JUMP JUMPDEST PUSH1 0x2 DUP4 DIV DUP1 DUP7 MSTORE PUSH2 0x5658 DUP11 PUSH2 0x5DCC JUMP JUMPDEST DUP9 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5676 JUMPI DUP2 SLOAD DUP12 DUP3 ADD PUSH1 0x40 ADD MSTORE SWAP1 DUP5 ADD SWAP1 DUP9 ADD PUSH2 0x565A JUMP JUMPDEST DUP11 ADD PUSH1 0x40 ADD SWAP6 POP POP POP JUMPDEST POP SWAP2 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE SWAP3 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP2 MSTORE SWAP4 DUP6 AND PUSH1 0x20 DUP6 ADD MSTORE SWAP2 SWAP1 SWAP4 AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x80 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 ADD PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND DUP5 MSTORE PUSH1 0x20 DUP2 DUP9 AND DUP2 DUP7 ADD MSTORE PUSH1 0x80 PUSH1 0x40 DUP7 ADD MSTORE DUP3 DUP8 MLOAD DUP1 DUP6 MSTORE PUSH1 0xA0 DUP8 ADD SWAP2 POP DUP3 DUP10 ADD SWAP5 POP DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5758 JUMPI DUP6 MLOAD DUP6 AND DUP4 MSTORE SWAP5 DUP4 ADD SWAP5 SWAP2 DUP4 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x573A JUMP JUMPDEST POP POP DUP6 DUP2 SUB PUSH1 0x60 DUP8 ADD MSTORE DUP7 MLOAD DUP1 DUP3 MSTORE SWAP1 DUP3 ADD SWAP4 POP SWAP2 POP DUP1 DUP7 ADD DUP5 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x578F JUMPI DUP2 MLOAD DUP6 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x5773 JUMP JUMPDEST POP SWAP3 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE ISZERO ISZERO PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ISZERO ISZERO PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x426F72696E674D6174683A20556E646572666C6F77 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A20616C726561647920696E697469616C697A65640000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x45524332303A206E6F207A65726F2061646472657373 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A20616C6C2061726520736F6C76656E74000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x12D85CDA1A54185A5C8E8818D85B1B0819985A5B1959 PUSH1 0x52 SHL 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 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x25B0B9B434A830B4B91D103130B2103830B4B9 PUSH1 0x69 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20616C6C6F77616E636520746F6F206C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x12D85CDA1A54185A5C8E8818D85B89DD0818D85B1B PUSH1 0x5A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH14 0x115490CC8C0E88115E1C1A5C9959 PUSH1 0x92 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x19 SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A207573657220696E736F6C76656E7400000000000000 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 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A204F776E65722063616E6E6F7420626520300000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH20 0x4B617368693A2062656C6F77206D696E696D756D PUSH1 0x60 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x45524332303A2062616C616E636520746F6F206C6F77 PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A20536B696D20746F6F206D7563680000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x4B61736869506169723A20496E76616C69642073776170706572000000000000 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 PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x4B61736869506169723A2072617465206E6F74206F6B PUSH1 0x50 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20496E76616C6964205369676E61747572650000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB 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 SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x5D36 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x5D4F JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0xF16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5D82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x5D9F JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x5DBE JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5DF3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5DDB JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x46B0 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x5E19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x5E19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x5E19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x5E19 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODEHASH XOR 0xCC ADDRESS LOG2 0xE7 0xD4 0xF7 DUP16 0xE6 PUSH4 0x32B88384 PUSH17 0xCDE14DB8273F5A89514BC3B7F5698A9E64 PUSH20 0x6F6C634300060C00330000000000000000000000 ",
              "sourceMap": "29834:33172:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31084:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40390:353;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;32463:200::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3683:489::-;;;;;;;;;;-1:-1:-1;3683:489:0;;;;;:::i;:::-;;:::i;:::-;;10259:201;;;;;;;;;;-1:-1:-1;10259:201:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47955:180::-;;;;;;;;;;-1:-1:-1;47955:180:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32812:92::-;;;;;;;;;;;;;:::i;44350:192::-;;;;;;;;;;-1:-1:-1;44350:192:0;;;;;:::i;:::-;;:::i;31706:54::-;;;;;;;;;;-1:-1:-1;31706:54:0;;;;;:::i;:::-;;:::i;45608:151::-;;;;;;;;;;-1:-1:-1;45608:151:0;;;;;:::i;:::-;;:::i;8776:1194::-;;;;;;;;;;-1:-1:-1;8776:1194:0;;;;;:::i;:::-;;:::i;32669:94::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6255:262::-;;;;;;;;;;;;;:::i;31242:19::-;;;;;;;;;;;;;:::i;32042:27::-;;;;;;;;;;;;;:::i;62601:111::-;;;;;;;;;;-1:-1:-1;62601:111:0;;;;;:::i;:::-;;:::i;31345:35::-;;;;;;;;;;;;;:::i;61940:349::-;;;;;;;;;;;;;:::i;31855:49::-;;;;;;;;;;-1:-1:-1;31855:49:0;;;;;:::i;:::-;;:::i;46790:167::-;;;;;;;;;;-1:-1:-1;46790:167:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;34985:439::-;;;;;;:::i;:::-;;:::i;4251:330::-;;;;;;;;;;;;;:::i;52720:4433::-;;;;;;:::i;:::-;;:::i;30949:37::-;;;;;;;;;;;;;:::i;7040:44::-;;;;;;;;;;-1:-1:-1;7040:44:0;;;;;:::i;:::-;;:::i;31294:23::-;;;;;;;;;;;;;:::i;57754:4132::-;;;;;;;;;;-1:-1:-1;57754:4132:0;;;;;:::i;:::-;;:::i;31267:21::-;;;;;;;;;;;;;:::i;7270:41::-;;;;;;;;;;-1:-1:-1;7270:41:0;;;;;:::i;:::-;;:::i;31544:25::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;41904:457::-;;;;;;;;;;-1:-1:-1;41904:457:0;;;;;:::i;:::-;;:::i;42949:190::-;;;;;;;;;;-1:-1:-1;42949:190:0;;;;;:::i;:::-;;:::i;31110:41::-;;;;;;;;;;-1:-1:-1;31110:41:0;;;;;:::i;:::-;;:::i;2847:20::-;;;;;;;;;;;;;:::i;32265:192::-;;;;;;;;;;;;;:::i;7739:737::-;;;;;;;;;;-1:-1:-1;7739:737:0;;;;;:::i;:::-;;:::i;32205:28::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;30992:53::-;;;;;;;;;;;;;:::i;11079:647::-;;;;;;;;;;-1:-1:-1;11079:647:0;;;;;:::i;:::-;;:::i;31212:24::-;;;;;;;;;;;;;:::i;7143:64::-;;;;;;;;;;-1:-1:-1;7143:64:0;;;;;:::i;:::-;;:::i;2873:27::-;;;;;;;;;;;;;:::i;62885:119::-;;;;;;;;;;-1:-1:-1;62885:119:0;;;;;:::i;:::-;;:::i;35528:3170::-;;;;;;;;;;;;;:::i;31415:24::-;;;;;;;;;;;;;:::i;31084:20::-;;;-1:-1:-1;;;;;31084:20:0;;:::o;40390:353::-;40492:6;;:22;;-1:-1:-1;;;40492:22:0;;40436:12;;;;-1:-1:-1;;;;;40492:6:0;;;;:10;;:22;;40503:10;;40492:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40474:40;;-1:-1:-1;40474:40:0;-1:-1:-1;40525:212:0;;;;40552:12;:19;;;40590:21;;;;;;40567:4;;40590:21;:::i;:::-;;;;;;;;40525:212;;;-1:-1:-1;40714:12:0;;40525:212;40390:353;;:::o;32463:200::-;32580:10;;32502:13;;32580:21;;-1:-1:-1;;;;;32580:10:0;:19;:21::i;:::-;32608:5;;:16;;-1:-1:-1;;;;;32608:5:0;:14;:16::i;:::-;32631:6;;:23;;-1:-1:-1;;;32631:23:0;;-1:-1:-1;;;;;32631:6:0;;;;:11;;:23;;32643:10;;32631:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32631:23:0;;;;;;;;;;;;:::i;:::-;32541:114;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32527:129;;32463:200;:::o;3683:489::-;4705:5;;-1:-1:-1;;;;;4705:5:0;4691:10;:19;4683:64;;;;-1:-1:-1;;;4683:64:0;;;;;;;:::i;:::-;;;;;;;;;3817:6:::1;3813:353;;;-1:-1:-1::0;;;;;3869:22:0;::::1;::::0;::::1;::::0;:34:::1;;;3895:8;3869:34;3861:68;;;;-1:-1:-1::0;;;3861:68:0::1;;;;;;;:::i;:::-;3993:5;::::0;3972:37:::1;::::0;-1:-1:-1;;;;;3972:37:0;;::::1;::::0;3993:5:::1;::::0;3972:37:::1;::::0;3993:5:::1;::::0;3972:37:::1;4023:5;:16:::0;;-1:-1:-1;;;;;4023:16:0;::::1;-1:-1:-1::0;;;;;;4023:16:0;;::::1;;::::0;;;4053:12:::1;:25:::0;;;;::::1;::::0;;3813:353:::1;;;4132:12;:23:::0;;-1:-1:-1;;;;;;4132:23:0::1;-1:-1:-1::0;;;;;4132:23:0;::::1;;::::0;;3813:353:::1;3683:489:::0;;;:::o;10259:201::-;10351:10;10325:4;10341:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;10341:30:0;;;;;;;;;;:39;;;10395:37;10325:4;;10341:30;;10395:37;;;;10374:6;;10395:37;:::i;:::-;;;;;;;;-1:-1:-1;10449:4:0;10259:201;;;;;:::o;47955:180::-;48053:14;48079:8;:6;:8::i;:::-;48106:22;48113:2;48117:4;48123;48106:6;:22::i;:::-;48097:31;47955:180;-1:-1:-1;;;;47955:180:0:o;32812:92::-;32882:10;:15;-1:-1:-1;;;32882:15:0;;-1:-1:-1;;;;;32882:15:0;;32812:92::o;44350:192::-;44452:16;44480:8;:6;:8::i;:::-;44509:26;44519:2;44523:4;44529:5;44509:9;:26::i;31706:54::-;;;;;;;;;;;;;:::o;45608:151::-;45675:13;45700:8;:6;:8::i;:::-;45726:26;45739:2;45743:8;45726:12;:26::i;:::-;45718:34;45608:151;-1:-1:-1;;;45608:151:0:o;8776:1194::-;8886:4;8969:11;;8965:937;;-1:-1:-1;;;;;9017:15:0;;8996:18;9017:15;;;;;;;;;;;9054:20;;;;9046:55;;;;-1:-1:-1;;;9046:55:0;;;;;;;:::i;:::-;9128:2;-1:-1:-1;;;;;9120:10:0;:4;-1:-1:-1;;;;;9120:10:0;;9116:776;;-1:-1:-1;;;;;9177:15:0;;9150:24;9177:15;;;:9;:15;;;;;;;;9193:10;9177:27;;;;;;;;-1:-1:-1;;9326:37:0;;9322:248;;9415:6;9395:16;:26;;9387:63;;;;-1:-1:-1;;;9387:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9472:15:0;;;;;;:9;:15;;;;;;;;9488:10;9472:27;;;;;;;9502:25;;;9472:55;;9322:248;-1:-1:-1;;;;;9595:16:0;;9587:51;;;;-1:-1:-1;;;9587:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;9707:15:0;;;:9;:15;;;;;;;;;;;9725:19;;;9707:37;;9786:13;;;;;;:23;;;;;;9116:776;8965:937;;9931:2;-1:-1:-1;;;;;9916:26:0;9925:4;-1:-1:-1;;;;;9916:26:0;;9935:6;9916:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;9959:4:0;8776:1194;;;;;:::o;32669:94::-;32736:5;;32712;;32736:20;;-1:-1:-1;;;;;32736:5:0;:18;:20::i;:::-;32729:27;;32669:94;:::o;6255:262::-;6304:7;6382:9;6428:25;6417:36;;:93;;6476:34;6502:7;6476:25;:34::i;:::-;6417:93;;;6456:17;6417:93;6410:100;;;6255:262;:::o;31242:19::-;;;-1:-1:-1;;;;;31242:19:0;;:::o;32042:27::-;;;;:::o;62601:111::-;4705:5;;-1:-1:-1;;;;;4705:5:0;4691:10;:19;4683:64;;;;-1:-1:-1;;;4683:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62679:17:0;;;::::1;;::::0;;;:8:::1;:17;::::0;;;;:26;;-1:-1:-1;;62679:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62601:111::o;31345:35::-;;;;:::o;61940:349::-;61981:8;:6;:8::i;:::-;61999:14;62016;-1:-1:-1;;;;;62016:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62078:10;:29;-1:-1:-1;;;;;62137:17:0;;62048:27;62137:17;;;;;;;;;;;;;-1:-1:-1;;;;62078:29:0;;-1:-1:-1;;;;;62078:29:0;;62137:42;;62078:29;62137:21;:42::i;:::-;-1:-1:-1;;;;;62117:17:0;;:9;:17;;;;;;;;;;;;:62;;;;62189:10;:33;;-1:-1:-1;;;;;62189:33:0;;;62238:44;;;;;;62262:19;;62238:44;:::i;:::-;;;;;;;;61940:349;;:::o;31855:49::-;;;;;;;;;;;;;:::o;46790:167::-;46858:12;46872:13;46897:8:::1;:6;:8::i;:::-;46931:19;46939:2;46943:6;46931:7;:19::i;:::-;46915:35;;;;;;;;40018:43:::0;40029:10;40041:5;40048:12;;40018:10;:43::i;:::-;40010:81;;;;-1:-1:-1;;;40010:81:0;;;;;;;:::i;:::-;46790:167;;;;;:::o;34985:439::-;35070:10;;-1:-1:-1;;;;;35070:10:0;35062:33;35054:76;;;;-1:-1:-1;;;35054:76:0;;;;;;;:::i;:::-;35182:50;;;;35193:4;35182:50;:::i;:::-;35140:92;;35141:10;;;;35153:5;;35141:10;;35160:6;;35141:10;;35140:92;;35168:10;;35140:92;;;;;:::i;:::-;-1:-1:-1;35140:92:0;;-1:-1:-1;;;;;35140:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35258:10:0;;;35242:65;;;;-1:-1:-1;;;35242:65:0;;;;;;;:::i;:::-;-1:-1:-1;;35318:10:0;:67;;-1:-1:-1;;35318:67:0;33712:9;35318:67;;;34985:439::o;4251:330::-;4318:12;;-1:-1:-1;;;;;4318:12:0;4367:10;:27;;4359:72;;;;-1:-1:-1;;;4359:72:0;;;;;;;:::i;:::-;4487:5;;4466:42;;-1:-1:-1;;;;;4466:42:0;;;;4487:5;;4466:42;;4487:5;;4466:42;4518:5;:21;;-1:-1:-1;;;;;4518:21:0;;;-1:-1:-1;;;;;;4518:21:0;;;;;;4549:12;:25;;;;;;;4251:330::o;52720:4433::-;52867:14;52883;52909:24;;:::i;:::-;52948:9;52943:4057;52963:18;;;52943:4057;;;53002:12;53017:7;;53025:1;53017:10;;;;;;;;;;;;;;;;;;;;:::i;:::-;53002:25;;53046:6;:17;;;53045:18;:33;;;;;53076:2;53067:6;:11;;;53045:33;53041:122;;;53098:8;:6;:8::i;:::-;53144:4;53124:17;;;:24;53041:122;53180:31;;;48702:2;53180:31;53176:3814;;;53232:12;53246:10;53258:9;53282:5;;53288:1;53282:8;;;;;;;;;;;;;;;;;;:::i;:::-;53271:45;;;;;;;:::i;:::-;53231:85;;;;;;53334:52;53348:2;53352:4;53358:27;53363:5;53370:6;53378;53358:4;:27::i;53334:52::-;53176:3814;;;;;;53411:26;;;48231:1;53411:26;53407:3583;;;53458:12;53472:10;53484:9;53508:5;;53514:1;53508:8;;;;;;;;;;;;;;;;;;:::i;:::-;53497:45;;;;;;;:::i;:::-;53457:85;;;;;;53569:48;53579:2;53583:4;53589:27;53594:5;53601:6;53609;53589:4;:27::i;:::-;53569:9;:48::i;:::-;53560:57;;53407:3583;;;;;;53642:22;;;48277:1;53642:22;53638:3352;;;53685:11;53698:10;53710:9;53734:5;;53740:1;53734:8;;;;;;;;;;;;;;;;;;:::i;:::-;53723:45;;;;;;;:::i;:::-;53684:84;;;;;;53786:44;53793:2;53797:4;53803:26;53808:4;53814:6;53822;53803:4;:26::i;:::-;53786:6;:44::i;:::-;;53638:3352;;;;;;53855:29;;;48330:1;53855:29;53851:3139;;;53905:15;53922:10;53947:5;;53953:1;53947:8;;;;;;;;;;;;;;;;;;:::i;:::-;53936:39;;;;;;;:::i;:::-;53904:71;;;;54002:48;54015:2;54019:30;54024:8;54034:6;54042;54019:4;:30::i;:::-;54002:12;:48::i;:::-;53993:57;;53851:3139;;;;;54075:34;;;48388:1;54075:34;54071:2919;;;54130:12;54144:10;54169:5;;54175:1;54169:8;;;;;;;;;;;;;;;;;;:::i;:::-;54158:39;;;;;;;:::i;:::-;54129:68;;;;54215:50;54233:2;54237:27;54242:5;54249:6;54257;54237:4;:27::i;:::-;54215:17;:50::i;:::-;-1:-1:-1;;54311:4:0;54283:32;;54071:2919;;;54340:23;;;48435:1;54340:23;54336:2654;;;54384:13;54399:10;54424:5;;54430:1;54424:8;;;;;;;;;;;;;;;;;;:::i;:::-;54413:39;;;;;;;:::i;:::-;54383:69;;;;54489:41;54497:2;54501:28;54506:6;54514;54522;54501:4;:28::i;:::-;54489:7;:41::i;:::-;54576:4;54548:32;;54470:60;;-1:-1:-1;54470:60:0;-1:-1:-1;54336:2654:0;;-1:-1:-1;;54336:2654:0;;54605:37;;;48764:2;54605:37;54601:2389;;;54663:16;54681:15;54698;54728:5;;54734:1;54728:8;;;;;;;;;;;;;;;;;;:::i;:::-;54717:46;;;;;;;:::i;:::-;54662:101;;;;;;54782:12;54796;54812:20;:18;:20::i;:::-;54781:51;;;;54860:11;54859:12;:23;;;;54875:7;54859:23;54858:43;;;;;54894:7;54887:4;:14;54858:43;:79;;;;-1:-1:-1;54906:12:0;;;:30;;;54929:7;54922:4;:14;54906:30;54850:114;;;;-1:-1:-1;;;54850:114:0;;;;;;;:::i;:::-;54601:2389;;;;;;;;54989:34;;;49084:2;54989:34;54985:2005;;;55044:12;55058:23;55083:13;55098:7;55107:9;55118;55162:5;;55168:1;55162:8;;;;;;;;;;;;;;;;;;:::i;:::-;55151:71;;;;;;;:::i;:::-;55043:179;;;;;;;;;;;;55240:8;-1:-1:-1;;;;;55240:34:0;;55275:4;55281:15;55298:8;55308:1;55311;55314;55240:76;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54985:2005;;;;;;;;;55341:30;;;48848:2;55341:30;55337:1653;;;55410:50;55424:5;;55430:1;55424:8;;;;;;;;;;;;;;;;;;:::i;:::-;55410:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55434:6:0;;-1:-1:-1;55434:6:0;;-1:-1:-1;55441:1:0;;-1:-1:-1;55434:9:0;;;;;;;;;;;;;55445:6;55453;55410:13;:50::i;:::-;55391:69;;-1:-1:-1;55391:69:0;-1:-1:-1;55337:1653:0;;;55485:31;;;48904:2;55485:31;55481:1509;;;55555:40;55570:5;;55576:1;55570:8;;;;;;;;;;;;;;;;;;:::i;:::-;55555:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55580:6:0;;-1:-1:-1;55588:6:0;;-1:-1:-1;55555:14:0;;-1:-1:-1;55555:40:0:i;55481:1509::-;55620:31;;;48960:2;55620:31;55616:1374;;;55672:12;55686:10;55698:12;55725:5;;55731:1;55725:8;;;;;;;;;;;;;;;;;;:::i;:::-;55714:47;;;;;;;:::i;:::-;55671:90;;;;;;55779:8;-1:-1:-1;;;;;55779:17:0;;55797:5;55804:10;55816:2;55820:27;55825:5;55832:6;55840;55820:4;:27::i;:::-;55779:69;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55616:1374;;;;;;55873:40;;;49025:2;55873:40;55869:1121;;;55934:12;55948:20;55970:23;56008:5;;56014:1;56008:8;;;;;;;;;;;;;;;;;;:::i;:::-;55997:52;;;;;;;:::i;:::-;55933:116;;;;;;56067:8;-1:-1:-1;;;;;56067:25:0;;56093:5;56100:10;56112:3;56117:6;56067:57;;;;;;;;;;;;;;;;;;:::i;55869:1121::-;56149:21;;;49177:2;56149:21;56145:845;;;56191:23;56216:18;56238:42;56244:6;;56251:1;56244:9;;;;;;;;;;;;;56255:5;;56261:1;56255:8;;;;;;;;;;;;;;;;;;:::i;:::-;56238:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56265:6:0;;-1:-1:-1;56273:6:0;;-1:-1:-1;56238:5:0;;-1:-1:-1;56238:42:0:i;:::-;56190:90;;;;56303:12;:17;;56319:1;56303:17;56299:239;;;56366:10;56355:33;;;;;;;;;;;;:::i;:::-;56344:44;;56299:239;;;56417:12;:17;;56433:1;56417:17;56413:125;;;56488:10;56477:42;;;;;;;;;;;;:::i;:::-;56458:61;;-1:-1:-1;56458:61:0;-1:-1:-1;56413:125:0;56145:845;;;;;56562:32;;;48491:1;56562:32;56558:432;;;56614:11;56639:5;;56645:1;56639:8;;;;;;;;;;;;;;;;;;:::i;:::-;56628:30;;;;;;;:::i;:::-;56702:5;;56614:44;;-1:-1:-1;;;;;;56685:8:0;:16;;;;;56702:5;56709:55;56731:26;56614:44;56742:6;56750;56731:4;:26::i;:::-;56709:21;;;;;;;;;:11;:21;-1:-1:-1;;;;;56709:21:0;;;;;-1:-1:-1;;;56709:21:0;;;;;;;;;56759:4;56709:21;:55::i;:::-;56766:4;56685:86;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56676:95;;56558:432;;;;56796:31;;;48546:1;56796:31;56792:198;;;56847:13;56874:5;;56880:1;56874:8;;;;;;;;;;;;;;;;;;:::i;:::-;56863:30;;;;;;;:::i;:::-;56847:46;;56920:55;56939:28;56944:6;56952;56960;56939:4;:28::i;:::-;56920:18;;;;;;;;;:11;:18;-1:-1:-1;;;;;56920:18:0;;;;;-1:-1:-1;;;56920:18:0;;;;;;;;;56969:5;56920:18;:55::i;:::-;56911:64;;56792:198;;-1:-1:-1;52983:3:0;;52943:4057;;;-1:-1:-1;57014:25:0;;57010:137;;;57063:43;57074:10;57086:5;57093:12;;57063:10;:43::i;:::-;57055:81;;;;-1:-1:-1;;;57055:81:0;;;;;;;:::i;:::-;52720:4433;;;;;;;;;;:::o;30949:37::-;;;:::o;7040:44::-;;;;;;;;;;;;;;:::o;31294:23::-;;;;;;;;;;;;;;;-1:-1:-1;;31294:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57754:4132::-;58008:21;58033:20;:18;:20::i;:::-;58005:48;;;58063:8;:6;:8::i;:::-;58082:26;58118:23;58151:21;58182:26;;:::i;:::-;-1:-1:-1;58182:40:0;;;;;;;;;58211:11;58182:40;-1:-1:-1;;;;;58182:40:0;;;;;-1:-1:-1;;;58182:40:0;;;;;;;;58232:28;;:::i;:::-;58279:10;;58263:27;;-1:-1:-1;;;58263:27:0;;-1:-1:-1;;;;;58263:8:0;:15;;;;;:27;;58279:10;;;;;58263:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58232:58;;58305:9;58300:1466;58320:16;;;58300:1466;;;58357:12;58372:5;;58378:1;58372:8;;;;;;;;;;;;;;;;;;;;:::i;:::-;58357:23;;58399:37;58410:4;58416;58422:13;58399:10;:37::i;:::-;58394:1362;;-1:-1:-1;;;;;58544:20:0;;58456:18;58544:20;;;:14;:20;;;;;;;58599:14;;58614:1;58599:17;;;;;;;;;;;;;:39;:81;;58663:14;;58678:1;58663:17;;;;;;;;;;;;;58599:81;;;58641:19;58599:81;58586:94;-1:-1:-1;58725:35:0;:19;58586:94;58725:23;:35::i;:::-;-1:-1:-1;;;;;58702:20:0;;;;;;:14;:20;;;;;:58;;;;:20;-1:-1:-1;58819:41:0;:12;58842:10;58702:20;58819:22;:41::i;:::-;58796:64;-1:-1:-1;58878:23:0;58924:250;59062:58;58971:59;59016:13;58971:40;58796:64;34153:6;58971:16;:40::i;:::-;:44;;:59::i;:::-;:150;;;;;58924:14;;58971:150;;59147:5;58924:21;:250::i;:::-;-1:-1:-1;;;;;59221:25:0;;;;;;:19;:25;;;;;;58878:296;;-1:-1:-1;59221:46:0;;58878:296;59221:29;:46::i;:::-;-1:-1:-1;;;;;59193:25:0;;;;;;;:19;:25;;;;;:74;;;;59316:22;;;:46;;59354:7;59316:46;;;59341:2;59316:46;-1:-1:-1;;;;;59290:90:0;59310:4;-1:-1:-1;;;;;59290:90:0;;59364:15;59290:90;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;59403:96:0;;;;59412:22;;;:54;;59458:7;59412:54;;;59437:10;59412:54;-1:-1:-1;;;;;59403:96:0;;59474:12;59488:10;59403:96;;;;;;;:::i;:::-;;;;;;;;59570:39;:18;59593:15;59570:22;:39::i;:::-;59549:60;-1:-1:-1;59645:33:0;:15;59665:12;59645:19;:33::i;:::-;59627:51;-1:-1:-1;59712:29:0;:13;59730:10;59712:17;:29::i;:::-;59696:45;;58394:1362;;;;-1:-1:-1;58338:3:0;;58300:1466;;;-1:-1:-1;59783:20:0;59775:59;;;;-1:-1:-1;;;59775:59:0;;;;;;;:::i;:::-;59867:49;59892:23;:15;:21;:23::i;:::-;59867:20;;-1:-1:-1;;;;;59867:24:0;;;:49::i;:::-;-1:-1:-1;;;;;59844:72:0;;;59946:44;59968:21;:13;:19;:21::i;:::-;59946:17;;;;-1:-1:-1;;;;;59946:21:0;;;:44::i;:::-;-1:-1:-1;;;;;59926:64:0;;;:17;;;:64;;;60000:26;;:11;:26;;-1:-1:-1;;;;;;60000:26:0;;;;;;;;;;;-1:-1:-1;;;60000:26:0;;;;;;60059:20;;:44;;60084:18;60059:24;:44::i;:::-;60036:20;:67;60156:5;;60139:46;;-1:-1:-1;;;60139:46:0;;60114:22;;-1:-1:-1;;;;;60139:8:0;:16;;;;;:46;;60156:5;;60163:15;;60156:5;;60139:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60114:71;;60201:4;60196:1684;;60319:32;;-1:-1:-1;;;60319:32:0;;-1:-1:-1;;;;;60319:14:0;:23;;;;:32;;60343:7;;60319:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60311:71;;;;-1:-1:-1;;;60311:71:0;;;;;;;:::i;:::-;60481:10;;60463:82;;-1:-1:-1;;;60463:82:0;;-1:-1:-1;;;;;60463:8:0;:17;;;;;:82;;60481:10;;;;;60501:4;;60516:7;;60526:18;;60463:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60572:10:0;;60584:5;;60559:82;;-1:-1:-1;;;60559:82:0;;-1:-1:-1;;;;;60559:12:0;;;;-1:-1:-1;60559:12:0;;-1:-1:-1;60559:82:0;;60572:10;;;60584:5;;60599:4;;60606:14;;60622:18;;60559:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;60733:10:0;:18;60699:5;;60680:40;;-1:-1:-1;;;60680:40:0;;60656:21;;60680:73;;-1:-1:-1;;;;;60733:18:0;;;;-1:-1:-1;;;;;60680:8:0;:18;;;;;:40;;60699:5;;;;;60714:4;;60680:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;:73::i;:::-;60656:97;-1:-1:-1;60767:18:0;60788:33;60656:97;60806:14;60788:17;:33::i;:::-;60767:54;-1:-1:-1;60835:16:0;34364:3;60854:28;60767:54;34298:5;60854:14;:28::i;:::-;:51;;;;;;60835:70;;60998:8;-1:-1:-1;;;;;60998:17:0;;61016:5;;;;;;;;;-1:-1:-1;;;;;61016:5:0;61031:4;61038:14;-1:-1:-1;;;;;61038:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61062:8;60998:73;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61106:59;61129:35;:27;61147:8;61129:13;:17;;:27;;;;:::i;:::-;:33;:35::i;:::-;61106:10;:18;-1:-1:-1;;;;;61106:18:0;;:22;:59::i;:::-;61085:10;:80;;-1:-1:-1;;;;;;61085:80:0;-1:-1:-1;;;;;61085:80:0;;;;;;;;;;61222:4;-1:-1:-1;;;;;61184:73:0;;;61229:24;:10;61244:8;61229:14;:24::i;:::-;61255:1;61184:73;;;;;;;:::i;:::-;;;;;;;;60196:1684;;;;;;61459:10;;-1:-1:-1;;;;;61441:8:0;:17;;;;;61459:10;;;;61479:4;;61486:22;;;:46;;61524:7;61486:46;;;61511:2;61486:46;61534:18;61441:112;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;61571:22:0;;;61567:140;;61626:10;;61638:5;;61613:79;;-1:-1:-1;;;61613:79:0;;-1:-1:-1;;;;;61613:12:0;;;;;;:79;;61626:10;;;;61638:5;;61645:10;;61657:14;;61673:18;;61613:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;61567:140;61739:5;;61721:67;;-1:-1:-1;;;61721:67:0;;-1:-1:-1;;;;;61721:8:0;:17;;;;;:67;;61739:5;;;;;61746:10;;61766:4;;61773:14;;61721:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61823:46;61846:22;:14;:20;:22::i;61823:46::-;61802:10;:67;;-1:-1:-1;;;;;;61802:67:0;-1:-1:-1;;;;;61802:67:0;;;;;;;;;;60196:1684;57754:4132;;;;;;;;;;;;;;:::o;31267:21::-;;;-1:-1:-1;;;;;31267:21:0;;:::o;7270:41::-;;;;;;;;;;;;;:::o;31544:25::-;;;-1:-1:-1;;;;;31544:25:0;;;;-1:-1:-1;;;31544:25:0;;;;:::o;41904:457::-;-1:-1:-1;;;;;42038:23:0;;;;;;:19;:23;;;;;;:34;;42066:5;42038:27;:34::i;:::-;-1:-1:-1;;;;;42012:23:0;;;;;;:19;:23;;;;;:60;42116:20;;42169:34;42116:20;42197:5;42169:27;:34::i;:::-;42146:20;:57;42224:10;;42213:60;;-1:-1:-1;;;;;42224:10:0;42236:5;42243:23;42268:4;42213:10;:60::i;:::-;42344:2;-1:-1:-1;;;;;42288:66:0;42305:4;:37;;42332:10;42305:37;;;42320:8;42305:37;-1:-1:-1;;;;;42288:66:0;;42348:5;42288:66;;;;;;:::i;:::-;;;;;;;;41904:457;;;;:::o;42949:190::-;43086:8:::1;:6;:8::i;:::-;43104:28;43122:2;43126:5;43104:17;:28::i;:::-;40018:43:::0;40029:10;40041:5;40048:12;;40018:10;:43::i;:::-;40010:81;;;;-1:-1:-1;;;40010:81:0;;;;;;;:::i;:::-;42949:190;;:::o;31110:41::-;;;;;;;;;;;;;;;:::o;2847:20::-;;;-1:-1:-1;;;;;2847:20:0;;:::o;32265:192::-;32368:10;;32306:13;;32368:23;;-1:-1:-1;;;;;32368:10:0;:21;:23::i;:::-;32398:5;;:18;;-1:-1:-1;;;;;32398:5:0;:16;:18::i;:::-;32423:6;;:25;;-1:-1:-1;;;32423:25:0;;-1:-1:-1;;;;;32423:6:0;;;;:13;;:25;;32437:10;;32423:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32423:25:0;;;;;;;;;;;;:::i;:::-;32345:104;;;;;;;;;;:::i;7739:737::-;7801:4;7890:11;;7886:516;;7948:10;7917:18;7938:21;;;;;;;;;;;7981:20;;;;7973:55;;;;-1:-1:-1;;;7973:55:0;;;;;;;:::i;:::-;8046:10;-1:-1:-1;;;;;8046:16:0;;;8042:350;;-1:-1:-1;;;;;8090:16:0;;8082:51;;;;-1:-1:-1;;;8082:51:0;;;;;;;:::i;:::-;8211:10;8201:9;:21;;;;;;;;;;;8225:19;;;8201:43;;-1:-1:-1;;;;;8286:13:0;;;;;;:23;;;;;;8042:350;7886:516;;8437:2;-1:-1:-1;;;;;8416:32:0;8425:10;-1:-1:-1;;;;;8416:32:0;;8441:6;8416:32;;;;;;:::i;32205:28::-;;;-1:-1:-1;;;;;32205:28:0;;;;-1:-1:-1;;;32205:28:0;;;;;;-1:-1:-1;;;32205:28:0;;-1:-1:-1;;;;;32205:28:0;;:::o;30992:53::-;;;:::o;11079:647::-;-1:-1:-1;;;;;11281:20:0;;11273:57;;;;-1:-1:-1;;;11273:57:0;;;;;;;:::i;:::-;11366:8;11348:15;:26;11340:53;;;;-1:-1:-1;;;11340:53:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11424:154:0;;11466:21;11513:14;;;:6;:14;;;;;;;;;:16;;11424:128;11513:16;;;;;;11455:85;;11424:128;;11434:108;;11455:85;;10619:66;;11572:6;;11497:7;;11506:5;;11513:16;11531:8;;11455:85;;:::i;:::-;;;;;;;;;;;;;11445:96;;;;;;11434:10;:108::i;:::-;11544:1;11547;11550;11424:128;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11424:154:0;;11403:225;;;;-1:-1:-1;;;11403:225:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11638:17:0;;;;;;;:9;:17;;;;;;;;:26;;;;;;;;;;;;;;:34;;;11687:32;;;;;11667:5;;11687:32;:::i;:::-;;;;;;;;11079:647;;;;;;;:::o;31212:24::-;;;-1:-1:-1;;;;;31212:24:0;;:::o;7143:64::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2873:27::-;;;-1:-1:-1;;;;;2873:27:0;;:::o;62885:119::-;4705:5;;-1:-1:-1;;;;;4705:5:0;4691:10;:19;4683:64;;;;-1:-1:-1;;;4683:64:0;;;;;;;:::i;:::-;62948:5:::1;:16:::0;;-1:-1:-1;;;;;;62948:16:0::1;-1:-1:-1::0;;;;;62948:16:0;::::1;::::0;;::::1;::::0;;;62979:18:::1;::::0;::::1;::::0;-1:-1:-1;;62979:18:0::1;62885:119:::0;:::o;35528:3170::-;35563:29;;:::i;:::-;-1:-1:-1;35563:42:0;;;;;;;;35595:10;35563:42;-1:-1:-1;;;;;35563:42:0;;;;;-1:-1:-1;;;35563:42:0;;;;;;;;;-1:-1:-1;;;35563:42:0;;;-1:-1:-1;;;;;35563:42:0;;;;;;;;;35690:15;:41;;35741:53;;35777:7;;;;35741:53;-1:-1:-1;;;;;35836:15:0;35803:49;:23;;;:49;35863:26;;:::i;:::-;-1:-1:-1;35863:40:0;;;;;;;;;35892:11;35863:40;-1:-1:-1;;;;;35863:40:0;;;;;-1:-1:-1;;;35863:40:0;;;;;;;;;;35913:405;;36023:29;;-1:-1:-1;;;;;36023:61:0;33712:9;36023:61;36019:231;;33712:9;36104:60;;;36187:48;;;;;;36104:29;;;;;;36187:48;:::i;:::-;;;;;;;;36019:231;-1:-1:-1;;36263:24:0;;:10;:24;;;;;;;;;;;-1:-1:-1;;36263:24:0;;;-1:-1:-1;;;;;36263:24:0;;;;-1:-1:-1;;;;36263:24:0;-1:-1:-1;;;36263:24:0;;;;;;;;;;;;-1:-1:-1;;;;;36263:24:0;;;-1:-1:-1;;;36263:24:0;;;;;;;;36301:7;;35913:405;36328:19;36361;36394:25;;:::i;:::-;-1:-1:-1;36394:38:0;;;;;;;;;36422:10;36394:38;-1:-1:-1;;;;;36394:38:0;;;;;-1:-1:-1;;;36394:38:0;;;;;;;;;36518:29;;36492:20;;36568:4;;36484:81;;36553:11;;36484:64;;:29;;-1:-1:-1;;;;;36484:64:0;:33;:64::i;:81::-;:88;;;;;;36470:102;;36605:45;36630:19;:11;:17;:19::i;:::-;36605:20;;-1:-1:-1;;;;;36605:24:0;;;:45::i;:::-;-1:-1:-1;;;;;36582:68:0;;;;36704:5;;36711:19;;36686:52;;-1:-1:-1;;;36686:52:0;;36582:20;;36686:78;;36582:68;;-1:-1:-1;;;;;36686:8:0;:17;;;;;:52;;36704:5;;;36711:19;36582:20;;36686:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;:78::i;:::-;36660:104;-1:-1:-1;36775:17:0;34364:3;36795:29;:11;34298:5;36795:15;:29::i;:::-;:52;;;;;;36775:72;;36939:15;36905:31;36919:11;:16;;;-1:-1:-1;;;;;36905:31:0;:9;:13;;:31;;;;:::i;:::-;:49;;;;;;36891:63;;36997:55;37032:19;:11;:17;:19::i;:::-;36997:30;;;;-1:-1:-1;;;;;36997:34:0;;;:55::i;:::-;-1:-1:-1;;;;;36964:88:0;:30;;;:88;37080:41;37101:19;:11;:17;:19::i;:::-;37080:16;;;;-1:-1:-1;;;;;37080:20:0;;;:41::i;:::-;37062:10;:59;;-1:-1:-1;;;;;37062:59:0;;;-1:-1:-1;;;37062:59:0;;;;;;;;;37131:26;;:11;:26;;;;;;-1:-1:-1;;;;;;37131:26:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37281:15:0;;37222:56;;33433:4;37222:33;:56::i;:::-;:74;;;;;;37200:96;;33296:4;37310:11;:40;37306:1257;;;37366:19;33296:4;37388:65;33646:4;37388:43;33296:4;37419:11;37388:30;:43::i;:65::-;:94;;;;;;;-1:-1:-1;37496:13:0;37512:70;37536:45;37569:11;37536:28;37388:94;;37536:15;:28::i;:45::-;33971:8;;37512:23;:70::i;:::-;37643:29;;37496:86;;-1:-1:-1;37496:86:0;;37635:63;;-1:-1:-1;;;;;37635:38:0;33971:8;37635:42;:63::i;:::-;:71;;;;;;-1:-1:-1;;;;;37596:111:0;;;;33798:8;-1:-1:-1;37722:178:0;;;33798:8;37805:59;;37722:178;37306:1257;;;;;33367:4;37920:11;:40;37916:647;;;37976:18;33551:45;37997:65;33487:4;37997:43;:11;33367:4;37997:15;:43::i;:65::-;:94;;;;;;;-1:-1:-1;38105:13:0;38121:68;38145:43;38176:11;38145:26;37997:94;;38145:14;:26::i;38121:68::-;38242:29;;38105:84;;-1:-1:-1;38203:28:0;;33971:8;;38234:49;;-1:-1:-1;;;;;38234:38:0;38105:84;38234:42;:49::i;:::-;:71;;;;;;;-1:-1:-1;33886:12:0;38323:50;;38319:160;;;-1:-1:-1;33886:12:0;38319:160;-1:-1:-1;;;;;38492:60:0;;;-1:-1:-1;;37916:647:0;38614:29;;38578:79;;;;;;38588:11;;38601;;38645;;38578:79;:::i;:::-;;;;;;;;-1:-1:-1;;38667:24:0;;:10;:24;;;;;;;;;;;-1:-1:-1;;38667:24:0;;;-1:-1:-1;;;;;38667:24:0;;;;-1:-1:-1;;;;38667:24:0;-1:-1:-1;;;38667:24:0;;;;;;;;;;;;-1:-1:-1;;;;;38667:24:0;;;-1:-1:-1;;;38667:24:0;;;;;;;;;-1:-1:-1;;;;;;35528:3170:0;:::o;31415:24::-;;;-1:-1:-1;;;;;31415:24:0;;;;-1:-1:-1;;;31415:24:0;;;;:::o;17776:241::-;17918:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17918:32:0;-1:-1:-1;;;17918:32:0;;;17892:59;;17831:13;;17857:12;;17831:13;;-1:-1:-1;;;;;17892:25:0;;;:59;;17918:32;17892:59;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17856:95;;;;17968:7;:42;;;;;;;;;;;;;;;-1:-1:-1;;;17968:42:0;;;;;;17978:24;17997:4;17978:18;:24::i;:::-;17961:49;;;;17776:241;;;;:::o;47012:558::-;47163:15;;;;;;;;;:11;:15;-1:-1:-1;;;;;47163:15:0;;;;;-1:-1:-1;;;47163:15:0;;;;;;;;47113:14;;47163:27;;47179:4;47185;47163:15;:27::i;:::-;47139:51;;47140:11;47139:51;;;;;;;-1:-1:-1;;;;;47139:51:0;;;-1:-1:-1;;;47139:51:0;;;;-1:-1:-1;;;;;;47139:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;47221:18:0;;47140:11;47221:18;;;:14;:18;;;;;;;;47139:51;;-1:-1:-1;47221:28:0;;47244:4;47221:22;:28::i;:::-;-1:-1:-1;;;;;47200:18:0;;;;;;;:14;:18;;;;;;:49;;;;47293:5;;47276:37;;-1:-1:-1;;;47276:37:0;;47200:18;;47276:8;:16;;;;;:37;;47293:5;;;;47300:6;;47293:5;;47276:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47344:10;:18;47383:5;;47260:53;;-1:-1:-1;;;;;;47344:18:0;;47372:51;;-1:-1:-1;;;;;47383:5:0;47260:53;47344:18;47418:4;47372:10;:51::i;:::-;47454:29;47469:13;:5;:11;:13::i;:::-;-1:-1:-1;;;;;47454:14:0;;;;:29::i;:::-;47433:10;:50;;-1:-1:-1;;;;;;47433:50:0;-1:-1:-1;;;;;47433:50:0;;;;;;;;;;-1:-1:-1;;;;;47498:65:0;;47507:4;:37;;47534:10;47507:37;;;47522:8;47507:37;-1:-1:-1;;;;;47498:65:0;;47550:6;47558:4;47498:65;;;;;;;:::i;:::-;;;;;;;;47012:558;;;;;;;:::o;43197:761::-;43302:16;43330:25;;:::i;:::-;-1:-1:-1;43330:38:0;;;;;;;;43358:10;43330:38;-1:-1:-1;;;;;43330:38:0;;;;;;-1:-1:-1;;;43330:38:0;;;;;;;;;43491:5;;43498:11;:19;43474:50;;-1:-1:-1;;;43474:50:0;;43330:38;;;;-1:-1:-1;;;;;;;43474:8:0;:16;;;;;:50;;43491:5;;;43498:19;;43330:38;;43474:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43452:19;;-1:-1:-1;;;;;43452:72:0;;;-1:-1:-1;43545:13:0;;:62;;43599:8;43569:27;43579:11;:16;;;-1:-1:-1;;;;;43569:27:0;:5;:9;;:27;;;;:::i;:::-;:38;;;;;;43545:62;;;43561:5;43545:62;43534:73;;43662:4;43621:38;43642:16;:8;:14;:16::i;:::-;43621;;;;-1:-1:-1;;;;;43621:20:0;;;:38::i;:::-;-1:-1:-1;;;;;43621:45:0;;43617:84;;;43689:1;43682:8;;;;;;;43617:84;43723:32;:11;43739:5;43746:8;43723:15;:32::i;:::-;43710:45;;:10;:45;;;;;;;-1:-1:-1;;;;;43710:45:0;;;-1:-1:-1;;;43710:45:0;;;;-1:-1:-1;;;;;;43710:45:0;;;;;;;;;;;;;;-1:-1:-1;;;;;43781:13:0;;43710:45;43781:13;;;;;;;;;;;:27;;43799:8;43781:17;:27::i;:::-;-1:-1:-1;;;;;43765:13:0;;;:9;:13;;;;;;;;;;:43;;;;43829:5;;43818:47;;43829:5;43836;43843:15;43860:4;43818:10;:47::i;:::-;43931:2;-1:-1:-1;;;;;43880:71:0;43892:4;:37;;43919:10;43892:37;;;43907:8;43892:37;-1:-1:-1;;;;;43880:71:0;;43935:5;43942:8;43880:71;;;;;;;:::i;:::-;;;;;;;;43197:761;;;;;;;;:::o;44603:729::-;44673:13;44698:25;;:::i;:::-;-1:-1:-1;44698:38:0;;;;;;;;44726:10;44698:38;-1:-1:-1;;;;;44698:38:0;;;;;-1:-1:-1;;;44698:38:0;;;;;;;;;44804:5;;44811:11;:19;44787:50;;-1:-1:-1;;;44787:50:0;;44698:38;;-1:-1:-1;;;;;;;44787:8:0;:16;;;;;:50;;44804:5;;;44811:19;;;44698:38;;44787:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44765:19;;44880:16;;;;-1:-1:-1;;;;;44765:72:0;;;;;;;;-1:-1:-1;44855:41:0;:22;:8;44765:72;44855:12;:22::i;:::-;:41;;;;;44940:10;44930:9;:21;;;;;;;;;;;44855:41;;;;-1:-1:-1;44930:35:0;;44956:8;44930:25;:35::i;:::-;44916:10;44906:9;:21;;;;;;;;;;:59;44997:38;45021:13;:5;:11;:13::i;44997:38::-;-1:-1:-1;;;;;44975:60:0;;;45064:38;45085:16;:8;:14;:16::i;45064:38::-;-1:-1:-1;;;;;45045:57:0;:16;;;:57;;;45140:4;-1:-1:-1;45120:24:0;45112:57;;;;-1:-1:-1;;;45112:57:0;;;;;;;:::i;:::-;45179:24;;:10;:24;;;;;;-1:-1:-1;;;;;45179:24:0;;;-1:-1:-1;;;45179:24:0;;;;-1:-1:-1;;;;;;45179:24:0;;;;;;;;;;;;;;45218:47;;-1:-1:-1;;;;;45218:47:0;;;45233:10;;45218:47;;;;45249:5;;45256:8;;45218:47;:::i;:::-;;;;;;;;45293:5;;45275:50;;-1:-1:-1;;;45275:50:0;;-1:-1:-1;;;;;45275:8:0;:17;;;;;:50;;45293:5;;;;;45308:4;;45315:2;;45319:5;;45275:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44603:729;;;;;;:::o;18219:260::-;18357:36;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18357:36:0;-1:-1:-1;;;18357:36:0;;;18331:63;;18278:5;;;;18310:17;;-1:-1:-1;;;;;18331:25:0;;;:63;;18357:36;18331:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18295:99;;;;18411:7;:28;;;;;18422:4;:11;18437:2;18422:17;18411:28;:61;;18470:2;18411:61;;;18453:4;18442:25;;;;;;;;;;;;:::i;5556:185::-;5630:7;5155:68;5710:7;5727:4;5666:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5656:78;;;;;;5649:85;;5556:185;;;:::o;1177:139::-;1269:5;;;1264:16;;;;1256:53;;;;-1:-1:-1;;;1256:53:0;;;;;;;:::i;45815:785::-;45878:12;;;34492:3;45937:30;:6;34419:2;45937:10;:30::i;:::-;:61;;;;;;;-1:-1:-1;46073:44:0;46089:21;:6;45937:61;46089:10;:21::i;:::-;46073:15;;;;;;;;;:11;:15;-1:-1:-1;;;;;46073:15:0;;;;;-1:-1:-1;;;46073:15:0;;;;;;;;;46112:4;46073:15;:44::i;:::-;46051:66;;46052:11;46051:66;;;;;;;-1:-1:-1;;;;;46051:66:0;;;-1:-1:-1;;;46051:66:0;;;;-1:-1:-1;;;;;;46051:66:0;;;;;;;;;;;;;;46171:10;46052:11;46156:26;;;:14;:26;;;;;;;;46051:66;;-1:-1:-1;46156:36:0;;46051:66;46156:30;:36::i;:::-;46142:10;46127:26;;;;:14;:26;;;;;;;:65;;;;46207:50;;-1:-1:-1;;;;;46207:50:0;;;46142:10;46207:50;;;;46233:6;;46241:9;;46252:4;;46207:50;:::i;:::-;;;;;;;;46293:5;;46276:38;;-1:-1:-1;;;46276:38:0;;-1:-1:-1;;;;;46276:8:0;:16;;;;;:38;;46293:5;;;;;46300:6;;46293:5;;46276:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46268:46;;46324:25;;:::i;:::-;-1:-1:-1;46324:38:0;;;;;;;;;46352:10;46324:38;-1:-1:-1;;;;;46324:38:0;;;;;-1:-1:-1;;;46324:38:0;;;;;;;;;;46400:4;-1:-1:-1;46380:24:0;46372:57;;;;-1:-1:-1;;;46372:57:0;;;;;;;:::i;:::-;46461:38;46485:13;:5;:11;:13::i;:::-;46461:19;;-1:-1:-1;;;;;46461:23:0;;;:38::i;:::-;-1:-1:-1;;;;;46439:60:0;;;;;;46509:10;:24;;;;;;;;-1:-1:-1;;;46509:24:0;-1:-1:-1;;;;;;46509:24:0;;;;;;;;;;;;46561:5;;46543:50;;-1:-1:-1;;;46543:50:0;;-1:-1:-1;;;;;46543:8:0;:17;;;;;:50;;46561:5;;;;;46576:4;;46583:2;;46587:5;;46543:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45815:785;;;;;;;:::o;38916:941::-;-1:-1:-1;;;;;39123:20:0;;39037:4;39123:20;;;:14;:20;;;;;;39157:15;39153:32;;39181:4;39174:11;;;;;39153:32;-1:-1:-1;;;;;39221:25:0;;39195:23;39221:25;;;:19;:25;;;;;;39260:20;39256:38;;39289:5;39282:12;;;;;;39256:38;39305:26;;:::i;:::-;-1:-1:-1;39305:40:0;;;;;;;;;39334:11;39305:40;-1:-1:-1;;;;;39305:40:0;;;;;;-1:-1:-1;;;39305:40:0;;;;;;;;;;;39775:55;;39816:13;;39775:36;;:10;;:14;:36::i;:55::-;:75;;;;;39410:10;;39775:75;;;;-1:-1:-1;;;;;39375:8:0;:17;;;;;39410:10;39438:183;39541:4;:62;;33011:5;39541:62;;;33082:5;39541:62;39438:77;:15;39458:56;39438:19;:77::i;:183::-;39639:5;39375:283;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:475;;;38916:941;-1:-1:-1;;;;;;;38916:941:0:o;49384:224::-;49497:14;49541:1;49532:5;:10;;:69;;-1:-1:-1;;49563:5:0;:19;:37;;49594:6;49563:37;;;49585:6;49563:37;49532:69;;;-1:-1:-1;49553:5:0;;49523:78;-1:-1:-1;;49384:224:0:o;42427:342::-;42554:10;42534:31;;;;:19;:31;;;;;;:42;;42570:5;42534:35;:42::i;:::-;42520:10;42500:31;;;;:19;:31;;;;;:76;42609:20;;:31;;42634:5;42609:24;:31::i;:::-;42586:20;:54;42655:42;;-1:-1:-1;;;;;42655:42:0;;;42675:10;;42655:42;;;;42691:5;;42655:42;:::i;:::-;;;;;;;;42725:10;;42707:55;;-1:-1:-1;;;42707:55:0;;-1:-1:-1;;;;;42707:8:0;:17;;;;;:55;;42725:10;;;;;42745:4;;42752:2;;42756:5;;42707:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42427:342;;:::o;49675:548::-;49820:7;49829;49849:12;49863:10;49875:13;49890:12;49917:4;49906:51;;;;;;;;;;;;:::i;:::-;49848:109;;;;;;;;49983:28;49988:6;49996;50004;49983:4;:28::i;:::-;49967:45;;50085:27;50090:5;50097:6;50105;50085:4;:27::i;:::-;50070:43;;50130:8;-1:-1:-1;;;;;50130:16:0;;50154:5;50161;50168:10;50180:2;50192:6;50209:5;50130:86;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50123:93;;;;;;;;49675:548;;;;;;;:::o;50291:383::-;50414:7;50423;50443:12;50457:10;50469:13;50484:12;50511:4;50500:51;;;;;;;;;;;;:::i;:::-;50442:109;;;;;;;;50568:8;-1:-1:-1;;;;;50568:17:0;;50586:5;50593:10;50605:2;50609:28;50614:6;50622;50630;50609:4;:28::i;:::-;50639:27;50644:5;50651:6;50659;50639:4;:27::i;:::-;50568:99;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50561:106;;;;;;;;50291:383;;;;;;:::o;50947:942::-;51084:12;51098:5;51116:14;51132:21;51155:14;51171;51187:18;51232:4;51221:53;;;;;;;;;;;;:::i;:::-;51115:159;;;;;;;;;;51289:9;:23;;;;;51303:9;51302:10;51289:23;51285:316;;;51356:8;51366:6;51339:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51328:45;;51285:316;;;51395:9;51394:10;:23;;;;;51408:9;51394:23;51390:211;;;51461:8;51471:6;51444:34;;;;;;;;;:::i;51390:211::-;51499:9;:22;;;;;51512:9;51499:22;51495:106;;;51565:8;51575:6;51583;51548:42;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51537:53;;51495:106;51637:8;-1:-1:-1;;;;;51619:27:0;:6;-1:-1:-1;;;;;51619:27:0;;;:54;;;;-1:-1:-1;;;;;;51650:23:0;;51668:4;51650:23;;51619:54;51611:88;;;;-1:-1:-1;;;51611:88:0;;;;;;;:::i;:::-;51711:12;51725:23;51752:6;-1:-1:-1;;;;;51752:11:0;51771:5;51778:8;51752:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51710:77;;;;51805:7;51797:42;;;;-1:-1:-1;;;51797:42:0;;;;;;;:::i;:::-;51857:10;51869:12;;-1:-1:-1;50947:942:0;;-1:-1:-1;;;;;;;;;;50947:942:0:o;13123:424::-;13244:15;13275:5;:10;;;-1:-1:-1;;;;;13275:15:0;13289:1;13275:15;13271:270;;;-1:-1:-1;13316:4:0;13271:270;;;13387:10;;;;13370:13;;-1:-1:-1;;;;;13361:36:0;;;;:23;;:4;;:23;:8;:23::i;:::-;:36;;;;;;13351:46;;13415:7;:57;;;;;13468:4;13452:5;:13;;;-1:-1:-1;;;;;13426:39:0;:23;13438:5;:10;;;-1:-1:-1;;;;;13426:23:0;:7;:11;;:23;;;;:::i;:::-;:39;;;;;;:46;13415:57;13411:120;;;13502:14;:7;13514:1;13502:11;:14::i;12615:418::-;12764:13;;12736:12;;-1:-1:-1;;;;;12764:18:0;12760:267;;-1:-1:-1;12805:7:0;12760:267;;;12876:13;;12862:10;;;;-1:-1:-1;;;;;12850:39:0;;;;:23;;:7;;:23;:11;:23::i;:::-;:39;;;;;;12843:46;;12907:7;:57;;;;;12957:7;12944:5;:10;;;-1:-1:-1;;;;;12918:36:0;:23;12927:5;:13;;;-1:-1:-1;;;;;12918:23:0;:4;:8;;:23;;;;:::i;1322:136::-;1414:5;;;1409:16;;;;1401:50;;;;-1:-1:-1;;;1401:50:0;;;;;;;:::i;1464:153::-;1522:9;1551:6;;;:30;;-1:-1:-1;;1566:5:0;;;1580:1;1575;1566:5;1575:1;1561:15;;;;;:20;1551:30;1543:67;;;;-1:-1:-1;;;1543:67:0;;;;;;;:::i;1623:158::-;1672:9;-1:-1:-1;;;;;1701:16:0;;;1693:57;;;;-1:-1:-1;;;1693:57:0;;;;;;;:::i;:::-;-1:-1:-1;1772:1:0;1623:158::o;2375:136::-;2467:5;;;-1:-1:-1;;;;;2462:16:0;;;;;;;;2454:50;;;;-1:-1:-1;;;2454:50:0;;;;;;;:::i;2230:139::-;2322:5;;;-1:-1:-1;;;;;2317:16:0;;;;;;;;2309:53;;;;-1:-1:-1;;;2309:53:0;;;;;;;:::i;41189:359::-;41325:4;41321:221;;;41362:51;41407:5;41362:8;-1:-1:-1;;;;;41362:18:0;;41381:5;41396:4;41362:40;;;;;;;;;;;;;;;;:::i;:51::-;41353:5;:60;;41345:97;;;;-1:-1:-1;;;41345:97:0;;;;;;;:::i;:::-;41321:221;;;41473:58;;-1:-1:-1;;;41473:58:0;;-1:-1:-1;;;;;41473:8:0;:17;;;;:58;;41491:5;;41498:10;;41518:4;;41525:5;;41473:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41321:221;41189:359;;;;:::o;17334:245::-;17478:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17478:34:0;-1:-1:-1;;;17478:34:0;;;17452:61;;17391:13;;17417:12;;17391:13;;-1:-1:-1;;;;;17452:25:0;;;:61;;17478:34;17452:61;:::i;6523:202::-;6584:14;6646:40;;;;;;;;;;;;;-1:-1:-1;;;6646:40:0;;;6688:18;:16;:18::i;:::-;6708:8;6629:88;;;;;;;;;;:::i;16562:571::-;16632:13;16676:2;16661:4;:11;:17;16657:470;;16712:4;16701:26;;;;;;;;;;;;:::i;:::-;16694:33;;;;16657:470;16748:4;:11;16763:2;16748:17;16744:383;;;16781:7;16806:67;16817:2;16813:1;:6;;;:22;;;;;16823:4;16828:1;16823:7;;;;;;;;;;;;;;-1:-1:-1;;;;;;16823:7:0;:12;;16813:22;16806:67;;;16855:3;;16806:67;;;16886:23;16922:1;16912:12;;-1:-1:-1;;;;;16912:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16912:12:0;;16886:38;;16947:1;16943:5;;16938:97;16954:2;16950:1;:6;;;:22;;;;;16960:4;16965:1;16960:7;;;;;;;;;;;;;;-1:-1:-1;;;;;;16960:7:0;:12;;16950:22;16938:97;;;17013:4;17018:1;17013:7;;;;;;;;;;;;;;;;;;16997:10;17008:1;16997:13;;;;;;;;;;;;;:23;-1:-1:-1;;;;;16997:23:0;;;;;;;;-1:-1:-1;16974:3:0;;;;;16938:97;;;17062:10;-1:-1:-1;17048:25:0;;-1:-1:-1;17048:25:0;16744:383;-1:-1:-1;17104:12:0;;;;;;;;;;;;-1:-1:-1;;;17104:12:0;;;;;;14219:349;14334:13;;:::i;:::-;14349:15;14386:31;14396:5;14403:4;14409:7;14386:9;:31::i;:::-;14376:41;;14443:34;14461:15;:7;:13;:15::i;:::-;14443:13;;-1:-1:-1;;;;;14443:17:0;;;:34::i;:::-;-1:-1:-1;;;;;14427:50:0;;;14500:28;14515:12;:4;:10;:12::i;:::-;14500:10;;;;-1:-1:-1;;;;;14500:14:0;;;:28::i;:::-;-1:-1:-1;;;;;14487:41:0;:10;;;:41;:10;;14219:349;-1:-1:-1;;;14219:349:0:o;14627:273::-;14745:13;;:::i;:::-;14786:34;14804:15;:7;:13;:15::i;14786:34::-;-1:-1:-1;;;;;14770:50:0;;;14843:28;14858:12;:4;:10;:12::i;14843:28::-;-1:-1:-1;;;;;14830:41:0;:10;;;:41;-1:-1:-1;14830:10:0;;14627:273;-1:-1:-1;;14627:273:0:o;13711:343::-;13829:13;;:::i;:::-;13844:12;13875:31;13882:5;13889:7;13898;13875:6;:31::i;:::-;13868:38;;13932:34;13950:15;:7;:13;:15::i;:::-;13932:13;;-1:-1:-1;;;;;13932:17:0;;;:34::i;:::-;-1:-1:-1;;;;;13916:50:0;;;13989:28;14004:12;:4;:10;:12::i;:::-;13989:10;;;;-1:-1:-1;;;;;13989:14:0;;;:28::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;5:130;72:20;;97:33;72:20;97:33;:::i;611:352::-;;;741:3;734:4;726:6;722:17;718:27;708:2;;-1:-1;;749:12;708:2;-1:-1;779:20;;-1:-1;;;;;808:30;;805:2;;;-1:-1;;841:12;805:2;885:4;877:6;873:17;861:29;;936:3;885:4;;920:6;916:17;877:6;902:32;;899:41;896:2;;;953:1;;943:12;2487:707;;2604:3;2597:4;2589:6;2585:17;2581:27;2571:2;;-1:-1;;2612:12;2571:2;2659:6;2646:20;2681:80;2696:64;2753:6;2696:64;:::i;:::-;2681:80;:::i;:::-;2789:21;;;2672:89;-1:-1;2833:4;2846:14;;;;2821:17;;;2935;;;2926:27;;;;2923:36;-1:-1;2920:2;;;2972:1;;2962:12;2920:2;2997:1;2982:206;3007:6;3004:1;3001:13;2982:206;;;7378:20;;3075:50;;3139:14;;;;3167;;;;3029:1;3022:9;2982:206;;;2986:14;;;;;2564:630;;;;:::o;4787:442::-;;4899:3;4892:4;4884:6;4880:17;4876:27;4866:2;;-1:-1;;4907:12;4866:2;4947:6;4941:13;4969:64;4984:48;5025:6;4984:48;:::i;4969:64::-;4960:73;;5053:6;5046:5;5039:21;5157:3;5089:4;5148:6;5081;5139:16;;5136:25;5133:2;;;5174:1;;5164:12;5133:2;5184:39;5216:6;5089:4;5115:5;5111:16;5089:4;5081:6;5077:17;5184:39;:::i;:::-;;4859:370;;;;:::o;7859:241::-;;7963:2;7951:9;7942:7;7938:23;7934:32;7931:2;;;-1:-1;;7969:12;7931:2;85:6;72:20;97:33;124:5;97:33;:::i;8107:263::-;;8222:2;8210:9;8201:7;8197:23;8193:32;8190:2;;;-1:-1;;8228:12;8190:2;226:6;220:13;238:33;265:5;238:33;:::i;8377:891::-;;;;;;;8577:3;8565:9;8556:7;8552:23;8548:33;8545:2;;;-1:-1;;8584:12;8545:2;371:6;358:20;383:41;418:5;383:41;:::i;:::-;8636:71;-1:-1;8744:2;8791:22;;358:20;383:41;358:20;383:41;:::i;:::-;8752:71;-1:-1;8860:2;8896:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;8868:60;-1:-1;8965:2;9002:22;;7654:20;7679:31;7654:20;7679:31;:::i;:::-;8539:729;;;;-1:-1;8539:729;;9071:3;9111:22;;3909:20;;9180:3;9220:22;;;3909:20;;-1:-1;8539:729;-1:-1;;8539:729::o;9275:906::-;;;;;;9467:3;9455:9;9446:7;9442:23;9438:33;9435:2;;;-1:-1;;9474:12;9435:2;528:6;522:13;540:41;575:5;540:41;:::i;:::-;9666:2;9651:18;;9645:25;9526:82;;-1:-1;;;;;;9679:30;;9676:2;;;-1:-1;;9712:12;9676:2;9742:73;9807:7;9798:6;9787:9;9783:22;9742:73;:::i;:::-;9732:83;;;9852:2;9903:9;9899:22;3782:13;3800:30;3824:5;3800:30;:::i;:::-;9968:2;10015:22;;3782:13;9860:71;;-1:-1;3800:30;3782:13;3800:30;:::i;:::-;10084:3;10133:22;;7798:13;9976:71;;-1:-1;7816:31;7798:13;7816:31;:::i;:::-;10093:72;;;;9429:752;;;;;;;;:::o;10188:366::-;;;10309:2;10297:9;10288:7;10284:23;10280:32;10277:2;;;-1:-1;;10315:12;10277:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;10367:63;-1:-1;10467:2;10506:22;;72:20;97:33;72:20;97:33;:::i;:::-;10475:63;;;;10271:283;;;;;:::o;10561:491::-;;;;10699:2;10687:9;10678:7;10674:23;10670:32;10667:2;;;-1:-1;;10705:12;10667:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;10757:63;-1:-1;10857:2;10896:22;;72:20;97:33;72:20;97:33;:::i;:::-;10661:391;;10865:63;;-1:-1;;;10965:2;11004:22;;;;7378:20;;10661:391::o;11059:991::-;;;;;;;;11263:3;11251:9;11242:7;11238:23;11234:33;11231:2;;;-1:-1;;11270:12;11231:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;11322:63;-1:-1;11422:2;11461:22;;72:20;97:33;72:20;97:33;:::i;:::-;11430:63;-1:-1;11530:2;11569:22;;7378:20;;-1:-1;11638:2;11677:22;;7378:20;;-1:-1;11746:3;11784:22;;7654:20;7679:31;7654:20;7679:31;:::i;:::-;11225:825;;;;-1:-1;11225:825;;;;11755:61;11853:3;11893:22;;3909:20;;-1:-1;11962:3;12002:22;;;3909:20;;11225:825;-1:-1;;11225:825::o;12057:479::-;;;;12189:2;12177:9;12168:7;12164:23;12160:32;12157:2;;;-1:-1;;12195:12;12157:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;12247:63;-1:-1;12347:2;12383:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;12355:60;-1:-1;12452:2;12488:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;12460:60;;;;12151:385;;;;;:::o;12543:485::-;;;;12678:2;12666:9;12657:7;12653:23;12649:32;12646:2;;;-1:-1;;12684:12;12646:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;12736:63;-1:-1;12836:2;12872:22;;3640:20;3665:30;3640:20;3665:30;:::i;13035:366::-;;;13156:2;13144:9;13135:7;13131:23;13127:32;13124:2;;;-1:-1;;13162:12;13124:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;13214:63;13314:2;13353:22;;;;7378:20;;-1:-1;;;13118:283::o;13408:1083::-;;;;;;;;13664:3;13652:9;13643:7;13639:23;13635:33;13632:2;;;-1:-1;;13671:12;13632:2;13729:17;13716:31;-1:-1;;;;;13767:18;13759:6;13756:30;13753:2;;;-1:-1;;13789:12;13753:2;13827:80;13899:7;13890:6;13879:9;13875:22;13827:80;:::i;:::-;13809:98;;-1:-1;13809:98;-1:-1;13972:2;13957:18;;13944:32;;-1:-1;13985:30;;;13982:2;;;-1:-1;;14018:12;13982:2;;14056:80;14128:7;14119:6;14108:9;14104:22;14056:80;:::i;:::-;14038:98;;-1:-1;14038:98;-1:-1;;14173:2;14212:22;;72:20;97:33;72:20;97:33;:::i;:::-;14181:63;-1:-1;14281:2;14337:22;;5828:20;5853:50;5828:20;5853:50;:::i;:::-;14289:80;-1:-1;14406:3;14443:22;;3640:20;3665:30;3640:20;3665:30;:::i;:::-;14415:60;;;;13626:865;;;;;;;;;;:::o;14498:977::-;;;;;;;14750:2;14738:9;14729:7;14725:23;14721:32;14718:2;;;-1:-1;;14756:12;14718:2;14814:17;14801:31;-1:-1;;;;;14852:18;14844:6;14841:30;14838:2;;;-1:-1;;14874:12;14838:2;14912:78;14982:7;14973:6;14962:9;14958:22;14912:78;:::i;:::-;14894:96;;-1:-1;14894:96;-1:-1;15055:2;15040:18;;15027:32;;-1:-1;15068:30;;;15065:2;;;-1:-1;;15101:12;15065:2;15139:80;15211:7;15202:6;15191:9;15187:22;15139:80;:::i;:::-;15121:98;;-1:-1;15121:98;-1:-1;15284:2;15269:18;;15256:32;;-1:-1;15297:30;;;15294:2;;;-1:-1;;15330:12;15294:2;;15368:91;15451:7;15442:6;15431:9;15427:22;15368:91;:::i;:::-;14712:763;;;;-1:-1;14712:763;;-1:-1;14712:763;;15350:109;;14712:763;-1:-1;;;14712:763::o;15482:257::-;;15594:2;15582:9;15573:7;15569:23;15565:32;15562:2;;;-1:-1;;15600:12;15562:2;3788:6;3782:13;3800:30;3824:5;3800:30;:::i;15746:393::-;;;15875:2;15863:9;15854:7;15850:23;15846:32;15843:2;;;-1:-1;;15881:12;15843:2;3788:6;3782:13;3800:30;3824:5;3800:30;:::i;:::-;16041:2;16091:22;;;;7526:13;15933:71;;7526:13;;-1:-1;;;15837:302::o;16146:485::-;;;;16281:2;16269:9;16260:7;16256:23;16252:32;16249:2;;;-1:-1;;16287:12;16249:2;3653:6;3640:20;3665:30;3689:5;3665:30;:::i;:::-;16339:60;16436:2;16475:22;;7378:20;;-1:-1;16544:2;16583:22;;;7378:20;;16243:388;-1:-1;;;16243:388::o;16638:365::-;;;16761:2;16749:9;16740:7;16736:23;16732:32;16729:2;;;-1:-1;;16767:12;16729:2;16825:17;16812:31;-1:-1;;;;;16863:18;16855:6;16852:30;16849:2;;;-1:-1;;16885:12;16849:2;16970:6;16959:9;16955:22;;;4107:3;4100:4;4092:6;4088:17;4084:27;4074:2;;-1:-1;;4115:12;4074:2;4158:6;4145:20;16863:18;4177:6;4174:30;4171:2;;;-1:-1;;4207:12;4171:2;4302:3;16761:2;4282:17;4243:6;4268:32;;4265:41;4262:2;;;-1:-1;;4309:12;4262:2;16761;4239:17;;;;;16905:82;;-1:-1;16723:280;;-1:-1;;;;16723:280::o;17552:714::-;;;;;17739:3;17727:9;17718:7;17714:23;17710:33;17707:2;;;-1:-1;;17746:12;17707:2;5503:6;5497:13;5515:48;5557:5;5515:48;:::i;:::-;17924:2;17982:22;;522:13;17798:89;;-1:-1;540:41;522:13;540:41;:::i;:::-;18051:2;18100:22;;6127:13;18169:2;18218:22;;;6127:13;17701:565;;17932:82;;-1:-1;17701:565;-1:-1;;;17701:565::o;18273:793::-;;;;18476:2;18464:9;18455:7;18451:23;18447:32;18444:2;;;-1:-1;;18482:12;18444:2;5332:6;5319:20;5344:48;5386:5;5344:48;:::i;:::-;18534:78;-1:-1;18677:2;18662:18;;;18649:32;-1:-1;;;;;18690:30;;;18687:2;;;-1:-1;;18723:12;18687:2;18814:6;18803:9;18799:22;;;1106:3;1099:4;1091:6;1087:17;1083:27;1073:2;;-1:-1;;1114:12;1073:2;1161:6;1148:20;1183:80;1198:64;1255:6;1198:64;:::i;1183:80::-;1291:21;;;1348:14;;;;1323:17;;;1437;;;1428:27;;;;1425:36;-1:-1;1422:2;;;-1:-1;;1464:12;1422:2;-1:-1;1490:10;;1484:206;1509:6;1506:1;1503:13;1484:206;;;1589:37;1622:3;1610:10;1589:37;:::i;:::-;1577:50;;1531:1;1524:9;;;;;1641:14;;;;1669;;1484:206;;;-1:-1;18743:88;-1:-1;;;18896:2;18881:18;;18868:32;;-1:-1;18909:30;;;18906:2;;;-1:-1;;18942:12;18906:2;;;18972:78;19042:7;19033:6;19022:9;19018:22;18972:78;:::i;:::-;18962:88;;;18438:628;;;;;:::o;19073:813::-;;;;;19283:3;19271:9;19262:7;19258:23;19254:33;19251:2;;;-1:-1;;19290:12;19251:2;5332:6;5319:20;5344:48;5386:5;5344:48;:::i;:::-;19342:78;-1:-1;19457:2;19511:22;;5319:20;5344:48;5319:20;5344:48;:::i;:::-;19465:78;-1:-1;19580:2;19635:22;;5658:20;5683:49;5658:20;5683:49;:::i;:::-;19588:79;-1:-1;19732:2;19717:18;;19704:32;-1:-1;;;;;19745:30;;19742:2;;;-1:-1;;19778:12;19742:2;19838:22;;4432:4;4420:17;;4416:27;-1:-1;4406:2;;-1:-1;;4447:12;4406:2;4494:6;4481:20;4516:64;4531:48;4572:6;4531:48;:::i;4516:64::-;4600:6;4593:5;4586:21;4704:3;19457:2;4695:6;4628;4686:16;;4683:25;4680:2;;;-1:-1;;4711:12;4680:2;76607:6;19457:2;4628:6;4624:17;19457:2;4662:5;4658:16;76584:30;76645:16;;;19457:2;76645:16;76638:27;;;;-1:-1;19245:641;;;;-1:-1;19245:641;-1:-1;19245:641::o;20175:394::-;;;20310:2;20298:9;20289:7;20285:23;20281:32;20278:2;;;-1:-1;;20316:12;20278:2;5841:6;5828:20;5853:50;5897:5;5853:50;:::i;:::-;20368:80;-1:-1;20485:2;20521:22;;3640:20;3665:30;3640:20;3665:30;:::i;20576:239::-;;20679:2;20667:9;20658:7;20654:23;20650:32;20647:2;;;-1:-1;;20685:12;20647:2;-1:-1;5981:20;;20641:174;-1:-1;20641:174::o;20822:380::-;;;20950:2;20938:9;20929:7;20925:23;20921:32;20918:2;;;-1:-1;;20956:12;20918:2;5994:6;5981:20;21008:62;;21107:2;21158:9;21154:22;358:20;383:41;418:5;383:41;:::i;21209:499::-;;;;21351:2;21339:9;21330:7;21326:23;21322:32;21319:2;;;-1:-1;;21357:12;21319:2;5994:6;5981:20;21409:62;;21508:2;21559:9;21555:22;358:20;383:41;418:5;383:41;:::i;21715:362::-;;21840:2;21828:9;21819:7;21815:23;21811:32;21808:2;;;-1:-1;;21846:12;21808:2;21897:17;21891:24;-1:-1;;;;;21927:6;21924:30;21921:2;;;-1:-1;;21957:12;21921:2;21987:74;22053:7;22044:6;22033:9;22029:22;21987:74;:::i;22084:309::-;;22222:2;22210:9;22201:7;22197:23;22193:32;22190:2;;;-1:-1;;22228:12;22190:2;6821:20;22222:2;6821:20;:::i;:::-;7254:6;7248:13;7266:33;7293:5;7266:33;:::i;:::-;6901:86;;7048:2;7113:22;;7248:13;7266:33;7248:13;7266:33;:::i;:::-;7048:2;7063:16;;7056:86;7067:5;22184:209;-1:-1;;;22184:209::o;22400:263::-;;22515:2;22503:9;22494:7;22490:23;22486:32;22483:2;;;-1:-1;;22521:12;22483:2;-1:-1;7526:13;;22477:186;-1:-1;22477:186::o;22670:399::-;;;22802:2;22790:9;22781:7;22777:23;22773:32;22770:2;;;-1:-1;;22808:12;22770:2;-1:-1;;7526:13;;22971:2;23021:22;;;7526:13;;;;;-1:-1;22764:305::o;23076:237::-;;23178:2;23166:9;23157:7;23153:23;23149:32;23146:2;;;-1:-1;;23184:12;23146:2;7667:6;7654:20;7679:31;7704:5;7679:31;:::i;23320:259::-;;23433:2;23421:9;23412:7;23408:23;23404:32;23401:2;;;-1:-1;;23439:12;23401:2;7804:6;7798:13;7816:31;7841:5;7816:31;:::i;26177:343::-;;26319:5;71390:12;72193:6;72188:3;72181:19;26412:52;26457:6;72230:4;72225:3;72221:14;72230:4;26438:5;26434:16;26412:52;:::i;:::-;77202:7;77186:14;-1:-1;;77182:28;26476:39;;;;72230:4;26476:39;;26267:253;-1:-1;;26267:253::o;39393:271::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;;39527:137;-1:-1;;39527:137::o;39671:410::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;25969:37;;;-1:-1;26831:4;40044:12;;39833:248;-1:-1;39833:248::o;40088:549::-;;26687:5;71390:12;26798:52;26843:6;26838:3;26831:4;26824:5;26820:16;26798:52;:::i;:::-;26862:16;;;;25969:37;;;-1:-1;26831:4;40489:12;;25969:37;40600:12;;;40278:359;-1:-1;40278:359::o;41204:1398::-;;-1:-1;;;30423:11;30416:41;26687:5;71390:12;26798:52;26843:6;30400:2;30480:3;30476:12;26831:4;26824:5;26820:16;26798:52;:::i;:::-;-1:-1;;;30400:2;26862:16;;;;;;38119:24;71390:12;;26798:52;71390:12;38162:11;;;26831:4;26820:16;;26798:52;:::i;:::-;-1:-1;;;38162:11;26862:16;;;;;;;35438:24;71390:12;;26798:52;71390:12;35481:11;;;26831:4;26820:16;;26798:52;:::i;:::-;26862:16;35481:11;26862:16;;41739:863;-1:-1;;;;;41739:863::o;42609:1398::-;;-1:-1;;;35789:11;35782:25;26687:5;71390:12;26798:52;26843:6;35767:1;35830:3;35826:11;26831:4;26824:5;26820:16;26798:52;:::i;:::-;-1:-1;;;35767:1;26862:16;;;;;;38119:24;71390:12;;26798:52;71390:12;38162:11;;;26831:4;26820:16;;26798:52;:::i;:::-;-1:-1;;;38162:11;26862:16;;;;;;;35438:24;71390:12;;26798:52;71390:12;35481:11;;;26831:4;26820:16;;26798:52;:::i;:::-;26862:16;35481:11;26862:16;;43144:863;-1:-1;;;;;43144:863::o;44014:222::-;-1:-1;;;;;74063:54;;;;24160:37;;44141:2;44126:18;;44112:124::o;44243:760::-;-1:-1;;;;;74063:54;;;24160:37;;74063:54;;;;44665:2;44650:18;;24160:37;73356:13;;73349:21;44742:2;44727:18;;25852:34;74382:4;74371:16;44821:2;44806:18;;39346:35;44904:3;44889:19;;25969:37;74074:42;44973:19;;25969:37;;;;44500:3;44485:19;;44471:532::o;45010:210::-;73356:13;;73349:21;25852:34;;45131:2;45116:18;;45102:118::o;45227:321::-;73356:13;;73349:21;25852:34;;45534:2;45519:18;;25969:37;45376:2;45361:18;;45347:201::o;45555:222::-;25969:37;;;45682:2;45667:18;;45653:124::o;45784:780::-;25969:37;;;-1:-1;;;;;74063:54;;;46216:2;46201:18;;24160:37;74063:54;;;;46299:2;46284:18;;24160:37;46382:2;46367:18;;25969:37;46465:3;46450:19;;25969:37;;;;74074:42;46534:19;;25969:37;46051:3;46036:19;;46022:542::o;46571:444::-;25969:37;;;46918:2;46903:18;;25969:37;;;;-1:-1;;;;;74063:54;47001:2;46986:18;;24160:37;46754:2;46739:18;;46725:290::o;47022:548::-;25969:37;;;74382:4;74371:16;;;;47390:2;47375:18;;39346:35;47473:2;47458:18;;25969:37;47556:2;47541:18;;25969:37;47229:3;47214:19;;47200:370::o;47577:306::-;;47722:2;47743:17;47736:47;47797:76;47722:2;47711:9;47707:18;47859:6;47797:76;:::i;47890:300::-;;48032:2;;48021:9;48017:18;48032:2;48053:17;48046:47;-1:-1;27030:5;27024:12;27064:1;;27053:9;27049:17;27077:1;27072:247;;;;27330:1;27325:400;;;;27042:683;;27072:247;27146:1;27131:17;;27150:4;27127:28;72181:19;;-1:-1;;27258:25;;72221:14;;;27246:38;27298:14;;;;-1:-1;27072:247;;27325:400;27394:1;27383:9;27379:17;72193:6;72188:3;72181:19;27502:37;27533:5;27502:37;:::i;:::-;-1:-1;27563:130;27577:6;27574:1;27571:13;27563:130;;;27636:14;;27623:11;;;72221:14;27623:11;27616:35;27670:15;;;;27592:12;;27563:130;;;27707:11;;72221:14;27707:11;;-1:-1;;;27042:683;-1:-1;48099:81;;48003:187;-1:-1;;;;;;;48003:187::o;48725:363::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;49074:2;49059:18;;24160:37;48895:2;48880:18;;48866:222::o;49095:602::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;;49517:2;49502:18;;24029:58;74063:54;;49600:2;49585:18;;24160:37;49683:2;49668:18;;25969:37;;;;49329:3;49314:19;;49300:397::o;49704:714::-;-1:-1;;;;;74063:54;;;27830:70;;74063:54;;;50154:2;50139:18;;24029:58;74063:54;;;;50237:2;50222:18;;24160:37;50320:2;50305:18;;25969:37;;;;50403:3;50388:19;;25969:37;;;;49966:3;49951:19;;49937:481::o;50425:898::-;;50759:3;50748:9;50744:19;819:18;;74074:42;;;;73166:5;74063:54;27837:3;27830:70;50947:2;74074:42;73166:5;74063:54;50947:2;50936:9;50932:18;24029:58;50759:3;50984:2;50973:9;50969:18;50962:48;51024:108;24553:5;71390:12;72193:6;72188:3;72181:19;72221:14;50748:9;72221:14;24565:93;;50947:2;24729:5;70922:14;24741:21;;-1:-1;24768:260;24793:6;24790:1;24787:13;24768:260;;;24854:13;;74063:54;;24160:37;;71921:14;;;;23740;;;;24815:1;24808:9;24768:260;;;-1:-1;;51170:20;;;51165:2;51150:18;;51143:48;71390:12;;72181:19;;;72221:14;;;;-1:-1;71390:12;-1:-1;70922:14;;;-1:-1;25497:260;25522:6;25519:1;25516:13;25497:260;;;25583:13;;25969:37;;23922:14;;;;71921;;;;24815:1;25537:9;25497:260;;;-1:-1;51197:116;;50730:593;-1:-1;;;;;;;;;50730:593::o;53409:462::-;-1:-1;;;;;74063:54;;;;27830:70;;-1:-1;;;;;73943:46;;;;53780:2;53765:18;;38711:50;73356:13;73349:21;53857:2;53842:18;;25852:34;53601:2;53586:18;;53572:299::o;53878:462::-;-1:-1;;;;;74063:54;;;;27830:70;;54249:2;54234:18;;25969:37;;;;73356:13;73349:21;54326:2;54311:18;;25852:34;54070:2;54055:18;;54041:299::o;55160:600::-;28679:58;;;55574:2;55559:18;;28679:58;;;;-1:-1;;;;;74269:30;55655:2;55640:18;;39231:36;55746:2;55731:18;;28679:58;55393:3;55378:19;;55364:396::o;56084:416::-;56284:2;56298:47;;;29695:2;56269:18;;;72181:19;-1:-1;;;72221:14;;;29711:44;29774:12;;;56255:245::o;56507:416::-;56707:2;56721:47;;;30025:2;56692:18;;;72181:19;30061:32;72221:14;;;30041:53;30113:12;;;56678:245::o;56930:416::-;57130:2;57144:47;;;30727:2;57115:18;;;72181:19;-1:-1;;;72221:14;;;30743:45;30807:12;;;57101:245::o;57353:416::-;57553:2;57567:47;;;31058:2;57538:18;;;72181:19;31094:28;72221:14;;;31074:49;31142:12;;;57524:245::o;57776:416::-;57976:2;57990:47;;;31393:2;57961:18;;;72181:19;-1:-1;;;72221:14;;;31409:44;31472:12;;;57947:245::o;58199:416::-;58399:2;58413:47;;;31723:2;58384:18;;;72181:19;-1:-1;;;72221:14;;;31739:45;31803:12;;;58370:245::o;58622:416::-;58822:2;58836:47;;;32054:2;58807:18;;;72181:19;32090:30;72221:14;;;32070:51;32140:12;;;58793:245::o;59045:416::-;59245:2;59259:47;;;32391:2;59230:18;;;72181:19;32427:26;72221:14;;;32407:47;32473:12;;;59216:245::o;59468:416::-;59668:2;59682:47;;;32724:2;59653:18;;;72181:19;-1:-1;;;72221:14;;;32740:42;32801:12;;;59639:245::o;59891:416::-;60091:2;60105:47;;;33052:2;60076:18;;;72181:19;33088:26;72221:14;;;33068:47;33134:12;;;60062:245::o;60314:416::-;60514:2;60528:47;;;33385:2;60499:18;;;72181:19;-1:-1;;;72221:14;;;33401:44;33464:12;;;60485:245::o;60737:416::-;60937:2;60951:47;;;33715:2;60922:18;;;72181:19;-1:-1;;;72221:14;;;33731:37;33787:12;;;60908:245::o;61160:416::-;61360:2;61374:47;;;34038:2;61345:18;;;72181:19;34074:27;72221:14;;;34054:48;34121:12;;;61331:245::o;61583:416::-;61783:2;61797:47;;;61768:18;;;72181:19;34408:34;72221:14;;;34388:55;34462:12;;;61754:245::o;62006:416::-;62206:2;62220:47;;;62191:18;;;72181:19;34749:34;72221:14;;;34729:55;34803:12;;;62177:245::o;62429:416::-;62629:2;62643:47;;;35054:2;62614:18;;;72181:19;35090:26;72221:14;;;35070:47;35136:12;;;62600:245::o;62852:416::-;63052:2;63066:47;;;36076:2;63037:18;;;72181:19;-1:-1;;;72221:14;;;36092:43;36154:12;;;63023:245::o;63275:416::-;63475:2;63489:47;;;36405:2;63460:18;;;72181:19;-1:-1;;;72221:14;;;36421:45;36485:12;;;63446:245::o;63698:416::-;63898:2;63912:47;;;36736:2;63883:18;;;72181:19;36772:26;72221:14;;;36752:47;36818:12;;;63869:245::o;64121:416::-;64321:2;64335:47;;;37069:2;64306:18;;;72181:19;37105:28;72221:14;;;37085:49;37153:12;;;64292:245::o;64544:416::-;64744:2;64758:47;;;37404:2;64729:18;;;72181:19;37440:26;72221:14;;;37420:47;37486:12;;;64715:245::o;64967:416::-;65167:2;65181:47;;;37737:2;65152:18;;;72181:19;-1:-1;;;72221:14;;;37753:45;37817:12;;;65138:245::o;65390:416::-;65590:2;65604:47;;;38412:2;65575:18;;;72181:19;38448:26;72221:14;;;38428:47;38494:12;;;65561:245::o;65813:333::-;-1:-1;;;;;73943:46;;;38591:37;;73943:46;;66132:2;66117:18;;38591:37;65968:2;65953:18;;65939:207::o;66382:349::-;25969:37;;;66717:2;66702:18;;28679:58;66545:2;66530:18;;66516:215::o;67078:444::-;25969:37;;;67425:2;67410:18;;25969:37;;;;67508:2;67493:18;;25969:37;67261:2;67246:18;;67232:290::o;68088:436::-;-1:-1;;;;;74269:30;;;39231:36;;74269:30;;;;68427:2;68412:18;;39231:36;-1:-1;;;;;73943:46;;;68510:2;68495:18;;38591:37;68267:2;68252:18;;68238:286::o;68531:214::-;74382:4;74371:16;;;;39346:35;;68654:2;68639:18;;68625:120::o;68752:506::-;;;68887:11;68874:25;68938:48;;68962:8;68946:14;68942:29;68938:48;68918:18;68914:73;68904:2;;-1:-1;;68991:12;68904:2;69018:33;;69072:18;;;-1:-1;;;;;;69099:30;;69096:2;;;-1:-1;;69132:12;69096:2;68977:4;69160:13;;-1:-1;68946:14;69192:38;;;69182:49;;69179:2;;;69244:1;;69234:12;69265:256;69327:2;69321:9;69353:17;;;-1:-1;;;;;69413:34;;69449:22;;;69410:62;69407:2;;;69485:1;;69475:12;69407:2;69327;69494:22;69305:216;;-1:-1;69305:216::o;69528:304::-;;-1:-1;;;;;69679:6;69676:30;69673:2;;;-1:-1;;69709:12;69673:2;-1:-1;69754:4;69742:17;;;69807:15;;69610:222::o;70150:321::-;;-1:-1;;;;;70285:6;70282:30;70279:2;;;-1:-1;;70315:12;70279:2;-1:-1;77202:7;70369:17;-1:-1;;70365:33;70456:4;70446:15;;70216:255::o;71123:157::-;;71217:14;;;71259:4;71246:18;;;71176:104::o;76680:268::-;76745:1;76752:101;76766:6;76763:1;76760:13;76752:101;;;76833:11;;;76827:18;76814:11;;;76807:39;76788:2;76781:10;76752:101;;;76868:6;76865:1;76862:13;76859:2;;;-1:-1;;76745:1;76915:16;;76908:27;76729:219::o;77223:117::-;-1:-1;;;;;74063:54;;77282:35;;77272:2;;77331:1;;77321:12;77272:2;77266:74;:::o;77487:111::-;77568:5;73356:13;73349:21;77546:5;77543:32;77533:2;;77589:1;;77579:12;78319:117;-1:-1;;;;;78406:5;73943:46;78381:5;78378:35;78368:2;;78427:1;;78417:12;78567:113;74382:4;78650:5;74371:16;78627:5;78624:33;78614:2;;78671:1;;78661:12"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "4839200",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite",
                "accrue()": "infinite",
                "accrueInfo()": "1323",
                "addAsset(address,bool,uint256)": "infinite",
                "addCollateral(address,bool,uint256)": "infinite",
                "allowance(address,address)": "infinite",
                "approve(address,uint256)": "22568",
                "asset()": "1160",
                "balanceOf(address)": "1339",
                "bentoBox()": "infinite",
                "borrow(address,uint256)": "infinite",
                "claimOwnership()": "45177",
                "collateral()": "1114",
                "cook(uint8[],uint256[],bytes[])": "infinite",
                "decimals()": "infinite",
                "exchangeRate()": "1140",
                "feeTo()": "1117",
                "init(bytes)": "infinite",
                "liquidate(address[],uint256[],address,address,bool)": "infinite",
                "masterContract()": "infinite",
                "name()": "infinite",
                "nonces(address)": "1313",
                "oracle()": "1115",
                "oracleData()": "infinite",
                "owner()": "1115",
                "pendingOwner()": "1158",
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite",
                "removeAsset(address,uint256)": "infinite",
                "removeCollateral(address,uint256)": "infinite",
                "repay(address,bool,uint256)": "infinite",
                "setFeeTo(address)": "23254",
                "setSwapper(address,bool)": "infinite",
                "swappers(address)": "1413",
                "symbol()": "infinite",
                "totalAsset()": "1274",
                "totalBorrow()": "1209",
                "totalCollateralShare()": "1073",
                "totalSupply()": "1131",
                "transfer(address,uint256)": "44354",
                "transferFrom(address,address,uint256)": "infinite",
                "transferOwnership(address,bool,bool)": "infinite",
                "updateExchangeRate()": "infinite",
                "userBorrowPart(address)": "1335",
                "userCollateralShare(address)": "1358",
                "withdrawFees()": "infinite"
              },
              "internal": {
                "_addAsset(address,bool,uint256)": "infinite",
                "_addTokens(contract IERC20,uint256,uint256,bool)": "infinite",
                "_bentoDeposit(bytes memory,uint256,uint256,uint256)": "infinite",
                "_bentoWithdraw(bytes memory,uint256,uint256)": "infinite",
                "_borrow(address,uint256)": "infinite",
                "_call(uint256,bytes memory,uint256,uint256)": "infinite",
                "_isSolvent(address,bool,uint256)": "infinite",
                "_num(int256,uint256,uint256)": "103",
                "_removeAsset(address,uint256)": "infinite",
                "_removeCollateral(address,uint256)": "infinite",
                "_repay(address,bool,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "accrue()": "f8ba4cff",
              "accrueInfo()": "b27c0e74",
              "addAsset(address,bool,uint256)": "1b51e940",
              "addCollateral(address,bool,uint256)": "860ffea1",
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "asset()": "38d52e0f",
              "balanceOf(address)": "70a08231",
              "bentoBox()": "6b2ace87",
              "borrow(address,uint256)": "4b8a3529",
              "claimOwnership()": "4e71e0c8",
              "collateral()": "d8dfeb45",
              "cook(uint8[],uint256[],bytes[])": "656f3d64",
              "decimals()": "313ce567",
              "exchangeRate()": "3ba0b9a9",
              "feeTo()": "017e7e58",
              "init(bytes)": "4ddf47d4",
              "liquidate(address[],uint256[],address,address,bool)": "76ee101b",
              "masterContract()": "cd446e22",
              "name()": "06fdde03",
              "nonces(address)": "7ecebe00",
              "oracle()": "7dc0d1d0",
              "oracleData()": "74645ff3",
              "owner()": "8da5cb5b",
              "pendingOwner()": "e30c3978",
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf",
              "removeAsset(address,uint256)": "2317ef67",
              "removeCollateral(address,uint256)": "876467f8",
              "repay(address,bool,uint256)": "15294c40",
              "setFeeTo(address)": "f46901ed",
              "setSwapper(address,bool)": "3f2617cb",
              "swappers(address)": "8cad7fbe",
              "symbol()": "95d89b41",
              "totalAsset()": "f9557ccb",
              "totalBorrow()": "8285ef40",
              "totalCollateralShare()": "473e3ce7",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd",
              "transferOwnership(address,bool,bool)": "078dfbe7",
              "updateExchangeRate()": "02ce728f",
              "userBorrowPart(address)": "48e4163e",
              "userCollateralShare(address)": "1c9e379b",
              "withdrawFees()": "476343ee"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IBentoBoxV1\",\"name\":\"bentoBox_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accruedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeFraction\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"rate\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"utilization\",\"type\":\"uint256\"}],\"name\":\"LogAccrue\",\"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\":\"share\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fraction\",\"type\":\"uint256\"}],\"name\":\"LogAddAsset\",\"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\":\"share\",\"type\":\"uint256\"}],\"name\":\"LogAddCollateral\",\"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\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"part\",\"type\":\"uint256\"}],\"name\":\"LogBorrow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"}],\"name\":\"LogExchangeRate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newFeeTo\",\"type\":\"address\"}],\"name\":\"LogFeeTo\",\"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\":\"share\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fraction\",\"type\":\"uint256\"}],\"name\":\"LogRemoveAsset\",\"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\":\"share\",\"type\":\"uint256\"}],\"name\":\"LogRemoveCollateral\",\"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\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"part\",\"type\":\"uint256\"}],\"name\":\"LogRepay\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeTo\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feesEarnedFraction\",\"type\":\"uint256\"}],\"name\":\"LogWithdrawFees\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accrue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accrueInfo\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"interestPerSecond\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastAccrued\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"feesEarnedFraction\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"skim\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"addAsset\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fraction\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"skim\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"addCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"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\":[],\"name\":\"asset\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bentoBox\",\"outputs\":[{\"internalType\":\"contract IBentoBoxV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"borrow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"part\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"collateral\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8[]\",\"name\":\"actions\",\"type\":\"uint8[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"datas\",\"type\":\"bytes[]\"}],\"name\":\"cook\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"value1\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value2\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchangeRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"users\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"maxBorrowParts\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"contract ISwapper\",\"name\":\"swapper\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"open\",\"type\":\"bool\"}],\"name\":\"liquidate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterContract\",\"outputs\":[{\"internalType\":\"contract KashiPairMediumRiskV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracle\",\"outputs\":[{\"internalType\":\"contract IOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracleData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"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\":\"address\",\"name\":\"owner_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fraction\",\"type\":\"uint256\"}],\"name\":\"removeAsset\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"share\",\"type\":\"uint256\"}],\"name\":\"removeCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"skim\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"part\",\"type\":\"uint256\"}],\"name\":\"repay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newFeeTo\",\"type\":\"address\"}],\"name\":\"setFeeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ISwapper\",\"name\":\"swapper\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"enable\",\"type\":\"bool\"}],\"name\":\"setSwapper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ISwapper\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"swappers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalAsset\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"elastic\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"base\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBorrow\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"elastic\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"base\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalCollateralShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[],\"name\":\"updateExchangeRate\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"updated\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userBorrowPart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userCollateralShare\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract allows contract calls to any contract (except BentoBox) from arbitrary callers thus, don't trust calls from this contract in any circumstances.\",\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Return the DOMAIN_SEPARATOR\"},\"addAsset(address,bool,uint256)\":{\"params\":{\"share\":\"The amount of shares to add.\",\"skim\":\"True if the amount should be skimmed from the deposit balance of msg.sender. False if tokens from msg.sender in `bentoBox` should be transferred.\",\"to\":\"The address of the user to receive the assets.\"},\"returns\":{\"fraction\":\"Total fractions added.\"}},\"addCollateral(address,bool,uint256)\":{\"params\":{\"share\":\"The amount of shares to add for `to`.\",\"skim\":\"True if the amount should be skimmed from the deposit balance of msg.sender. False if tokens from msg.sender in `bentoBox` should be transferred.\",\"to\":\"The receiver of the tokens.\"}},\"approve(address,uint256)\":{\"params\":{\"amount\":\"The maximum collective amount that `spender` can draw.\",\"spender\":\"Address of the party that can draw from msg.sender's account.\"},\"returns\":{\"_0\":\"(bool) Returns True if approved.\"}},\"borrow(address,uint256)\":{\"returns\":{\"part\":\"Total part of the debt held by borrowers.\",\"share\":\"Total amount in shares borrowed.\"}},\"cook(uint8[],uint256[],bytes[])\":{\"params\":{\"actions\":\"An array with a sequence of actions to execute (see ACTION_ declarations).\",\"datas\":\"A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\",\"values\":\"A one-to-one mapped array to `actions`. ETH amounts to send along with the actions. Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\"},\"returns\":{\"value1\":\"May contain the first positioned return value of the last executed action (if applicable).\",\"value2\":\"May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\"}},\"init(bytes)\":{\"details\":\"`data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\"},\"liquidate(address[],uint256[],address,address,bool)\":{\"params\":{\"maxBorrowParts\":\"A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\",\"open\":\"True to perform a open liquidation else False.\",\"swapper\":\"Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\",\"to\":\"Address of the receiver in open liquidations if `swapper` is zero.\",\"users\":\"An array of user addresses.\"}},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"params\":{\"deadline\":\"This permit must be redeemed before this deadline (UTC timestamp in seconds).\",\"owner_\":\"Address of the owner.\",\"spender\":\"The address of the spender that gets approved to draw from `owner_`.\",\"value\":\"The maximum collective amount that `spender` can draw.\"}},\"removeAsset(address,uint256)\":{\"params\":{\"fraction\":\"The amount/fraction of assets held to remove.\",\"to\":\"The user that receives the removed assets.\"},\"returns\":{\"share\":\"The amount of shares transferred to `to`.\"}},\"removeCollateral(address,uint256)\":{\"params\":{\"share\":\"Amount of shares to remove.\",\"to\":\"The receiver of the shares.\"}},\"repay(address,bool,uint256)\":{\"params\":{\"part\":\"The amount to repay. See `userBorrowPart`.\",\"skim\":\"True if the amount should be skimmed from the deposit balance of msg.sender. False if tokens from msg.sender in `bentoBox` should be transferred.\",\"to\":\"Address of the user this payment should go.\"},\"returns\":{\"amount\":\"The total amount repayed.\"}},\"setFeeTo(address)\":{\"params\":{\"newFeeTo\":\"The address of the receiver.\"}},\"setSwapper(address,bool)\":{\"params\":{\"enable\":\"True to enable the swapper. To disable use False.\",\"swapper\":\"The address of the swapper contract that conforms to `ISwapper`.\"}},\"transfer(address,uint256)\":{\"params\":{\"amount\":\"of the tokens to move.\",\"to\":\"The address to move the tokens.\"},\"returns\":{\"_0\":\"(bool) Returns True if succeeded.\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"amount\":\"The token amount to move.\",\"from\":\"Address to draw tokens from.\",\"to\":\"The address to move the tokens.\"},\"returns\":{\"_0\":\"(bool) Returns True if succeeded.\"}},\"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.\"}},\"updateExchangeRate()\":{\"returns\":{\"rate\":\"The new exchange rate.\",\"updated\":\"True if `exchangeRate` was updated.\"}}},\"title\":\"KashiPair\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"accrue()\":{\"notice\":\"Accrues the interest on the borrowed tokens and handles the accumulation of fees.\"},\"addAsset(address,bool,uint256)\":{\"notice\":\"Adds assets to the lending pair.\"},\"addCollateral(address,bool,uint256)\":{\"notice\":\"Adds `collateral` from msg.sender to the account `to`.\"},\"allowance(address,address)\":{\"notice\":\"owner > spender > allowance mapping.\"},\"approve(address,uint256)\":{\"notice\":\"Approves `amount` from sender to be spend by `spender`.\"},\"balanceOf(address)\":{\"notice\":\"owner > balance mapping.\"},\"borrow(address,uint256)\":{\"notice\":\"Sender borrows `amount` and transfers it to `to`.\"},\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"constructor\":\"The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\",\"cook(uint8[],uint256[],bytes[])\":{\"notice\":\"Executes a set of actions and allows composability (contract calls) to other contracts.\"},\"exchangeRate()\":{\"notice\":\"Exchange and interest rate tracking. This is 'cached' here because calls to Oracles can be very expensive.\"},\"init(bytes)\":{\"notice\":\"Serves as the constructor for clones, as clones can't have a regular constructor\"},\"liquidate(address[],uint256[],address,address,bool)\":{\"notice\":\"Handles the liquidation of users' balances, once the users' amount of collateral is too low.\"},\"nonces(address)\":{\"notice\":\"owner > nonce mapping. Used in `permit`.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"notice\":\"Approves `value` from `owner_` to be spend by `spender`.\"},\"removeAsset(address,uint256)\":{\"notice\":\"Removes an asset from msg.sender and transfers it to `to`.\"},\"removeCollateral(address,uint256)\":{\"notice\":\"Removes `share` amount of collateral and transfers it to `to`.\"},\"repay(address,bool,uint256)\":{\"notice\":\"Repays a loan.\"},\"setFeeTo(address)\":{\"notice\":\"Sets the beneficiary of fees accrued in liquidations. MasterContract Only Admin function.\"},\"setSwapper(address,bool)\":{\"notice\":\"Used to register and enable or disable swapper contracts used in closed liquidations. MasterContract Only Admin function.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers `amount` tokens from `msg.sender` to `to`.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\"},\"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`.\"},\"updateExchangeRate()\":{\"notice\":\"Gets the exchange rate. I.e how much collateral to buy 1e18 asset. This function is supposed to be invoked if needed because Oracle queries can be expensive.\"},\"withdrawFees()\":{\"notice\":\"Withdraws the fees accumulated.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":\"KashiPairMediumRiskV1\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"license\":\"UNLICENSED\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 423,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "balanceOf",
                "offset": 0,
                "slot": "0",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 430,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "allowance",
                "offset": 0,
                "slot": "1",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 435,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "nonces",
                "offset": 0,
                "slot": "2",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 202,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "owner",
                "offset": 0,
                "slot": "3",
                "type": "t_address"
              },
              {
                "astId": 204,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "pendingOwner",
                "offset": 0,
                "slot": "4",
                "type": "t_address"
              },
              {
                "astId": 1987,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "feeTo",
                "offset": 0,
                "slot": "5",
                "type": "t_address"
              },
              {
                "astId": 1991,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "swappers",
                "offset": 0,
                "slot": "6",
                "type": "t_mapping(t_contract(ISwapper)1880,t_bool)"
              },
              {
                "astId": 1993,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "collateral",
                "offset": 0,
                "slot": "7",
                "type": "t_contract(IERC20)1118"
              },
              {
                "astId": 1995,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "asset",
                "offset": 0,
                "slot": "8",
                "type": "t_contract(IERC20)1118"
              },
              {
                "astId": 1997,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "oracle",
                "offset": 0,
                "slot": "9",
                "type": "t_contract(IOracle)1841"
              },
              {
                "astId": 1999,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "oracleData",
                "offset": 0,
                "slot": "10",
                "type": "t_bytes_storage"
              },
              {
                "astId": 2001,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "totalCollateralShare",
                "offset": 0,
                "slot": "11",
                "type": "t_uint256"
              },
              {
                "astId": 2003,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "totalAsset",
                "offset": 0,
                "slot": "12",
                "type": "t_struct(Rebase)753_storage"
              },
              {
                "astId": 2005,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "totalBorrow",
                "offset": 0,
                "slot": "13",
                "type": "t_struct(Rebase)753_storage"
              },
              {
                "astId": 2009,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "userCollateralShare",
                "offset": 0,
                "slot": "14",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 2013,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "userBorrowPart",
                "offset": 0,
                "slot": "15",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 2016,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "exchangeRate",
                "offset": 0,
                "slot": "16",
                "type": "t_uint256"
              },
              {
                "astId": 2025,
                "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                "label": "accrueInfo",
                "offset": 0,
                "slot": "17",
                "type": "t_struct(AccrueInfo)2023_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes_storage": {
                "encoding": "bytes",
                "label": "bytes",
                "numberOfBytes": "32"
              },
              "t_contract(IERC20)1118": {
                "encoding": "inplace",
                "label": "contract IERC20",
                "numberOfBytes": "20"
              },
              "t_contract(IOracle)1841": {
                "encoding": "inplace",
                "label": "contract IOracle",
                "numberOfBytes": "20"
              },
              "t_contract(ISwapper)1880": {
                "encoding": "inplace",
                "label": "contract ISwapper",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_mapping(t_contract(ISwapper)1880,t_bool)": {
                "encoding": "mapping",
                "key": "t_contract(ISwapper)1880",
                "label": "mapping(contract ISwapper => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_struct(AccrueInfo)2023_storage": {
                "encoding": "inplace",
                "label": "struct KashiPairMediumRiskV1.AccrueInfo",
                "members": [
                  {
                    "astId": 2018,
                    "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                    "label": "interestPerSecond",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint64"
                  },
                  {
                    "astId": 2020,
                    "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                    "label": "lastAccrued",
                    "offset": 8,
                    "slot": "0",
                    "type": "t_uint64"
                  },
                  {
                    "astId": 2022,
                    "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                    "label": "feesEarnedFraction",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(Rebase)753_storage": {
                "encoding": "inplace",
                "label": "struct Rebase",
                "members": [
                  {
                    "astId": 750,
                    "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                    "label": "elastic",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 752,
                    "contract": "contracts/bentobox/KashiPairMediumRiskV1.sol:KashiPairMediumRiskV1",
                    "label": "base",
                    "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": {
              "accrue()": {
                "notice": "Accrues the interest on the borrowed tokens and handles the accumulation of fees."
              },
              "addAsset(address,bool,uint256)": {
                "notice": "Adds assets to the lending pair."
              },
              "addCollateral(address,bool,uint256)": {
                "notice": "Adds `collateral` from msg.sender to the account `to`."
              },
              "allowance(address,address)": {
                "notice": "owner > spender > allowance mapping."
              },
              "approve(address,uint256)": {
                "notice": "Approves `amount` from sender to be spend by `spender`."
              },
              "balanceOf(address)": {
                "notice": "owner > balance mapping."
              },
              "borrow(address,uint256)": {
                "notice": "Sender borrows `amount` and transfers it to `to`."
              },
              "claimOwnership()": {
                "notice": "Needs to be called by `pendingOwner` to claim ownership."
              },
              "constructor": "The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.",
              "cook(uint8[],uint256[],bytes[])": {
                "notice": "Executes a set of actions and allows composability (contract calls) to other contracts."
              },
              "exchangeRate()": {
                "notice": "Exchange and interest rate tracking. This is 'cached' here because calls to Oracles can be very expensive."
              },
              "init(bytes)": {
                "notice": "Serves as the constructor for clones, as clones can't have a regular constructor"
              },
              "liquidate(address[],uint256[],address,address,bool)": {
                "notice": "Handles the liquidation of users' balances, once the users' amount of collateral is too low."
              },
              "nonces(address)": {
                "notice": "owner > nonce mapping. Used in `permit`."
              },
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "notice": "Approves `value` from `owner_` to be spend by `spender`."
              },
              "removeAsset(address,uint256)": {
                "notice": "Removes an asset from msg.sender and transfers it to `to`."
              },
              "removeCollateral(address,uint256)": {
                "notice": "Removes `share` amount of collateral and transfers it to `to`."
              },
              "repay(address,bool,uint256)": {
                "notice": "Repays a loan."
              },
              "setFeeTo(address)": {
                "notice": "Sets the beneficiary of fees accrued in liquidations. MasterContract Only Admin function."
              },
              "setSwapper(address,bool)": {
                "notice": "Used to register and enable or disable swapper contracts used in closed liquidations. MasterContract Only Admin function."
              },
              "transfer(address,uint256)": {
                "notice": "Transfers `amount` tokens from `msg.sender` to `to`."
              },
              "transferFrom(address,address,uint256)": {
                "notice": "Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`."
              },
              "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`."
              },
              "updateExchangeRate()": {
                "notice": "Gets the exchange rate. I.e how much collateral to buy 1e18 asset. This function is supposed to be invoked if needed because Oracle queries can be expensive."
              },
              "withdrawFees()": {
                "notice": "Withdraws the fees accumulated."
              }
            },
            "version": 1
          }
        },
        "RebaseLibrary": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206794b4629640b661ee665319d99781e3e504ec39095dd6baa9eb2c766babbd0c64736f6c634300060c0033",
              "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 PUSH8 0x94B4629640B661EE PUSH7 0x5319D99781E3E5 DIV 0xEC CODECOPY MULMOD 0x5D 0xD6 0xBA 0xA9 0xEB 0x2C PUSH23 0x6BABBD0C64736F6C634300060C00330000000000000000 ",
              "sourceMap": "12431:2808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206794b4629640b661ee665319d99781e3e504ec39095dd6baa9eb2c766babbd0c64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH8 0x94B4629640B661EE PUSH7 0x5319D99781E3E5 DIV 0xEC CODECOPY MULMOD 0x5D 0xD6 0xBA 0xA9 0xEB 0x2C PUSH23 0x6BABBD0C64736F6C634300060C00330000000000000000 ",
              "sourceMap": "12431:2808: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",
                "sub(struct Rebase memory,uint256,bool)": "infinite",
                "sub(struct Rebase memory,uint256,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/bentobox/KashiPairMediumRiskV1.sol\":\"RebaseLibrary\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/bentobox/KashiPairMediumRiskV1.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n//  __  __             __    __      _____                  __ __\\n// |  |/  .---.-.-----|  |--|__|    |     |_.-----.-----.--|  |__.-----.-----.\\n// |     <|  _  |__ --|     |  |    |       |  -__|     |  _  |  |     |  _  |\\n// |__|\\\\__|___._|_____|__|__|__|    |_______|_____|__|__|_____|__|__|__|___  |\\n//                                                                     |_____|\\n\\n// Copyright (c) 2021 BoringCrypto - All rights reserved\\n// Twitter: @Boring_Crypto\\n\\n// Special thanks to:\\n// @0xKeno - for all his invaluable contributions\\n// @burger_crypto - for the idea of trying to let the LPs benefit from liquidations\\n\\n// Version: 22-Feb-2021\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\n// solhint-disable avoid-low-level-calls\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\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// File @boringcrypto/boring-solidity/contracts/BoringOwnable.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\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/Domain.sol@v1.2.0\\n// License-Identifier: MIT\\n// Based on code and smartness by Ross Campbell and Keno\\n// Uses immutable to store the domain separator to reduce gas usage\\n// If the chain id changes due to a fork, the forked chain will calculate on the fly.\\n\\ncontract Domain {\\n    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256(\\\"EIP712Domain(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\\n    // solhint-disable var-name-mixedcase\\n    bytes32 private immutable _DOMAIN_SEPARATOR;\\n    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;\\n\\n    /// @dev Calculate the DOMAIN_SEPARATOR\\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\\n        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, chainId, address(this)));\\n    }\\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    /// @dev Return the DOMAIN_SEPARATOR\\n    // It's named internal to allow making it public from the contract that uses it by creating a simple view function\\n    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.\\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    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {\\n        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, DOMAIN_SEPARATOR(), dataHash));\\n    }\\n}\\n\\n// File @boringcrypto/boring-solidity/contracts/ERC20.sol@v1.2.0\\n// License-Identifier: MIT\\n\\n// solhint-disable no-inline-assembly\\n// solhint-disable not-rely-on-time\\n\\n// Data part taken out for building of contracts that receive delegate calls\\ncontract ERC20Data {\\n    /// @notice owner > balance mapping.\\n    mapping(address => uint256) public balanceOf;\\n    /// @notice owner > spender > allowance mapping.\\n    mapping(address => mapping(address => uint256)) public allowance;\\n    /// @notice owner > nonce mapping. Used in `permit`.\\n    mapping(address => uint256) public nonces;\\n}\\n\\ncontract ERC20 is ERC20Data, Domain {\\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 Transfers `amount` tokens from `msg.sender` to `to`.\\n    /// @param to The address to move the tokens.\\n    /// @param amount of the tokens to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transfer(address to, uint256 amount) public returns (bool) {\\n        // If `amount` is 0, or `msg.sender` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[msg.sender];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n            if (msg.sender != to) {\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so low balance calls safe some gas\\n\\n                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(msg.sender, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\\n    /// @param from Address to draw tokens from.\\n    /// @param to The address to move the tokens.\\n    /// @param amount The token amount to move.\\n    /// @return (bool) Returns True if succeeded.\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) public returns (bool) {\\n        // If `amount` is 0, or `from` is `to` nothing happens\\n        if (amount != 0) {\\n            uint256 srcBalance = balanceOf[from];\\n            require(srcBalance >= amount, \\\"ERC20: balance too low\\\");\\n\\n            if (from != to) {\\n                uint256 spenderAllowance = allowance[from][msg.sender];\\n                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).\\n                if (spenderAllowance != type(uint256).max) {\\n                    require(spenderAllowance >= amount, \\\"ERC20: allowance too low\\\");\\n                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked\\n                }\\n                require(to != address(0), \\\"ERC20: no zero address\\\"); // Moved down so other failed calls safe some gas\\n\\n                balanceOf[from] = srcBalance - amount; // Underflow is checked\\n                balanceOf[to] += amount; // Can't overflow because totalSupply would be greater than 2^256-1\\n            }\\n        }\\n        emit Transfer(from, to, amount);\\n        return true;\\n    }\\n\\n    /// @notice Approves `amount` from sender to be spend by `spender`.\\n    /// @param spender Address of the party that can draw from msg.sender's account.\\n    /// @param amount The maximum collective amount that `spender` can draw.\\n    /// @return (bool) Returns True if approved.\\n    function approve(address spender, uint256 amount) public returns (bool) {\\n        allowance[msg.sender][spender] = amount;\\n        emit Approval(msg.sender, spender, amount);\\n        return true;\\n    }\\n\\n    // keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\\n\\n    /// @notice Approves `value` from `owner_` to be spend by `spender`.\\n    /// @param owner_ Address of the owner.\\n    /// @param spender The address of the spender that gets approved to draw from `owner_`.\\n    /// @param value The maximum collective amount that `spender` can draw.\\n    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).\\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        require(owner_ != address(0), \\\"ERC20: Owner cannot be 0\\\");\\n        require(block.timestamp < deadline, \\\"ERC20: Expired\\\");\\n        require(\\n            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==\\n                owner_,\\n            \\\"ERC20: Invalid Signature\\\"\\n        );\\n        allowance[owner_][spender] = value;\\n        emit Approval(owner_, spender, value);\\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/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\\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\\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    function returnDataToString(bytes memory data) internal pure returns (string memory) {\\n        if (data.length >= 64) {\\n            return abi.decode(data, (string));\\n        } else if (data.length == 32) {\\n            uint8 i = 0;\\n            while (i < 32 && data[i] != 0) {\\n                i++;\\n            }\\n            bytes memory bytesArray = new bytes(i);\\n            for (i = 0; i < 32 && data[i] != 0; i++) {\\n                bytesArray[i] = data[i];\\n            }\\n            return string(bytesArray);\\n        } else {\\n            return \\\"???\\\";\\n        }\\n    }\\n\\n    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token symbol.\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (string) Token name.\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));\\n        return success ? returnDataToString(data) : \\\"???\\\";\\n    }\\n\\n    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\\n    /// @param token The address of the ERC-20 token contract.\\n    /// @return (uint8) Token decimals.\\n    function safeDecimals(IERC20 token) internal view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBatchFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBatchFlashBorrower {\\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 @tattooswap/bentobox-sdk/contracts/IFlashBorrower.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IFlashBorrower {\\n    function onFlashLoan(\\n        address sender,\\n        IERC20 token,\\n        uint256 amount,\\n        uint256 fee,\\n        bytes calldata data\\n    ) external;\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IStrategy.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IStrategy {\\n    // Send the assets to the Strategy and call skim to invest them\\n    function skim(uint256 amount) external;\\n\\n    // Harvest any profits made converted to the asset and pass them to the caller\\n    function harvest(uint256 balance, address sender) external returns (int256 amountAdded);\\n\\n    // Withdraw assets. The returned amount can differ from the requested amount due to rounding.\\n    // 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.\\n    function withdraw(uint256 amount) external returns (uint256 actualAmount);\\n\\n    // Withdraw all assets in the safest way possible. This shouldn't fail.\\n    function exit(uint256 balance) external returns (int256 amountAdded);\\n}\\n\\n// File @tattooswap/bentobox-sdk/contracts/IBentoBoxV1.sol@v1.0.1\\n// License-Identifier: MIT\\n\\ninterface IBentoBoxV1 {\\n    event LogDeploy(address indexed masterContract, bytes data, address indexed cloneAddress);\\n    event LogDeposit(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event LogFlashLoan(address indexed borrower, address indexed token, uint256 amount, uint256 feeAmount, address indexed receiver);\\n    event LogRegisterProtocol(address indexed protocol);\\n    event LogSetMasterContractApproval(address indexed masterContract, address indexed user, bool approved);\\n    event LogStrategyDivest(address indexed token, uint256 amount);\\n    event LogStrategyInvest(address indexed token, uint256 amount);\\n    event LogStrategyLoss(address indexed token, uint256 amount);\\n    event LogStrategyProfit(address indexed token, uint256 amount);\\n    event LogStrategyQueued(address indexed token, address indexed strategy);\\n    event LogStrategySet(address indexed token, address indexed strategy);\\n    event LogStrategyTargetPercentage(address indexed token, uint256 targetPercentage);\\n    event LogTransfer(address indexed token, address indexed from, address indexed to, uint256 share);\\n    event LogWhiteListMasterContract(address indexed masterContract, bool approved);\\n    event LogWithdraw(address indexed token, address indexed from, address indexed to, uint256 amount, uint256 share);\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    function balanceOf(IERC20, address) external view returns (uint256);\\n\\n    function batch(bytes[] calldata calls, bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results);\\n\\n    function batchFlashLoan(\\n        IBatchFlashBorrower borrower,\\n        address[] calldata receivers,\\n        IERC20[] calldata tokens,\\n        uint256[] calldata amounts,\\n        bytes calldata data\\n    ) external;\\n\\n    function claimOwnership() external;\\n\\n    function deploy(\\n        address masterContract,\\n        bytes calldata data,\\n        bool useCreate2\\n    ) external payable;\\n\\n    function deposit(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external payable returns (uint256 amountOut, uint256 shareOut);\\n\\n    function flashLoan(\\n        IFlashBorrower borrower,\\n        address receiver,\\n        IERC20 token,\\n        uint256 amount,\\n        bytes calldata data\\n    ) external;\\n\\n    function harvest(\\n        IERC20 token,\\n        bool balance,\\n        uint256 maxChangeAmount\\n    ) external;\\n\\n    function masterContractApproved(address, address) external view returns (bool);\\n\\n    function masterContractOf(address) external view returns (address);\\n\\n    function nonces(address) external view returns (uint256);\\n\\n    function owner() external view returns (address);\\n\\n    function pendingOwner() external view returns (address);\\n\\n    function pendingStrategy(IERC20) external view returns (IStrategy);\\n\\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    ) external;\\n\\n    function registerProtocol() external;\\n\\n    function setMasterContractApproval(\\n        address user,\\n        address masterContract,\\n        bool approved,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    function setStrategy(IERC20 token, IStrategy newStrategy) external;\\n\\n    function setStrategyTargetPercentage(IERC20 token, uint64 targetPercentage_) external;\\n\\n    function strategy(IERC20) external view returns (IStrategy);\\n\\n    function strategyData(IERC20)\\n        external\\n        view\\n        returns (\\n            uint64 strategyStartDate,\\n            uint64 targetPercentage,\\n            uint128 balance\\n        );\\n\\n    function toAmount(\\n        IERC20 token,\\n        uint256 share,\\n        bool roundUp\\n    ) external view returns (uint256 amount);\\n\\n    function toShare(\\n        IERC20 token,\\n        uint256 amount,\\n        bool roundUp\\n    ) external view returns (uint256 share);\\n\\n    function totals(IERC20) external view returns (Rebase memory totals_);\\n\\n    function transfer(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 share\\n    ) external;\\n\\n    function transferMultiple(\\n        IERC20 token,\\n        address from,\\n        address[] calldata tos,\\n        uint256[] calldata shares\\n    ) external;\\n\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) external;\\n\\n    function whitelistMasterContract(address masterContract, bool approved) external;\\n\\n    function whitelistedMasterContracts(address) external view returns (bool);\\n\\n    function withdraw(\\n        IERC20 token_,\\n        address from,\\n        address to,\\n        uint256 amount,\\n        uint256 share\\n    ) external returns (uint256 amountOut, uint256 shareOut);\\n}\\n\\n// File contracts/interfaces/IOracle.sol\\n// License-Identifier: MIT\\n\\ninterface IOracle {\\n    /// @notice Get the latest exchange rate.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function get(bytes calldata data) external returns (bool success, uint256 rate);\\n\\n    /// @notice Check the last exchange rate without any state changes.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return success if no valid (recent) rate is available, return false else true.\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peek(bytes calldata data) external view returns (bool success, uint256 rate);\\n\\n    /// @notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return rate The rate of the requested asset / pair / pool.\\n    function peekSpot(bytes calldata data) external view returns (uint256 rate);\\n\\n    /// @notice Returns a human readable (short) name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable symbol name about this oracle.\\n    function symbol(bytes calldata data) external view returns (string memory);\\n\\n    /// @notice Returns a human readable name about this oracle.\\n    /// @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\\n    /// For example:\\n    /// (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\\n    /// @return (string) A human readable name about this oracle.\\n    function name(bytes calldata data) external view returns (string memory);\\n}\\n\\n// File contracts/interfaces/ISwapper.sol\\n// License-Identifier: MIT\\n\\ninterface ISwapper {\\n    /// @notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for at least 'amountToMin' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Returns the amount of tokens 'to' transferred to BentoBox.\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swap(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        uint256 shareToMin,\\n        uint256 shareFrom\\n    ) external returns (uint256 extraShare, uint256 shareReturned);\\n\\n    /// @notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\\n    /// this should be less than or equal to amountFromMax.\\n    /// Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\\n    /// Swaps it for exactly 'exactAmountTo' of token 'to'.\\n    /// Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\\n    /// Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\\n    /// Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\\n    /// (The BentoBox skim function will be used by the caller to get the swapped funds).\\n    function swapExact(\\n        IERC20 fromToken,\\n        IERC20 toToken,\\n        address recipient,\\n        address refundTo,\\n        uint256 shareFromSupplied,\\n        uint256 shareToExact\\n    ) external returns (uint256 shareUsed, uint256 shareReturned);\\n}\\n\\n// File contracts/KashiPair.sol\\n// License-Identifier: UNLICENSED\\n// Kashi Lending Medium Risk\\n\\n/// @title KashiPair\\n/// @dev This contract allows contract calls to any contract (except BentoBox)\\n/// from arbitrary callers thus, don't trust calls from this contract in any circumstances.\\ncontract KashiPairMediumRiskV1 is ERC20, BoringOwnable, IMasterContract {\\n    using BoringMath for uint256;\\n    using BoringMath128 for uint128;\\n    using RebaseLibrary for Rebase;\\n    using BoringERC20 for IERC20;\\n\\n    event LogExchangeRate(uint256 rate);\\n    event LogAccrue(uint256 accruedAmount, uint256 feeFraction, uint64 rate, uint256 utilization);\\n    event LogAddCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogAddAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogRemoveCollateral(address indexed from, address indexed to, uint256 share);\\n    event LogRemoveAsset(address indexed from, address indexed to, uint256 share, uint256 fraction);\\n    event LogBorrow(address indexed from, address indexed to, uint256 amount, uint256 feeAmount, uint256 part);\\n    event LogRepay(address indexed from, address indexed to, uint256 amount, uint256 part);\\n    event LogFeeTo(address indexed newFeeTo);\\n    event LogWithdrawFees(address indexed feeTo, uint256 feesEarnedFraction);\\n\\n    // Immutables (for MasterContract and all clones)\\n    IBentoBoxV1 public immutable bentoBox;\\n    KashiPairMediumRiskV1 public immutable masterContract;\\n\\n    // MasterContract variables\\n    address public feeTo;\\n    mapping(ISwapper => bool) public swappers;\\n\\n    // Per clone variables\\n    // Clone init settings\\n    IERC20 public collateral;\\n    IERC20 public asset;\\n    IOracle public oracle;\\n    bytes public oracleData;\\n\\n    // Total amounts\\n    uint256 public totalCollateralShare; // Total collateral supplied\\n    Rebase public totalAsset; // elastic = BentoBox shares held by the KashiPair, base = Total fractions held by asset suppliers\\n    Rebase public totalBorrow; // elastic = Total token amount to be repayed by borrowers, base = Total parts of the debt held by borrowers\\n\\n    // User balances\\n    mapping(address => uint256) public userCollateralShare;\\n    // userAssetFraction is called balanceOf for ERC20 compatibility (it's in ERC20.sol)\\n    mapping(address => uint256) public userBorrowPart;\\n\\n    /// @notice Exchange and interest rate tracking.\\n    /// This is 'cached' here because calls to Oracles can be very expensive.\\n    uint256 public exchangeRate;\\n\\n    struct AccrueInfo {\\n        uint64 interestPerSecond;\\n        uint64 lastAccrued;\\n        uint128 feesEarnedFraction;\\n    }\\n\\n    AccrueInfo public accrueInfo;\\n\\n    // ERC20 'variables'\\n    function symbol() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"km\\\", collateral.safeSymbol(), \\\"/\\\", asset.safeSymbol(), \\\"-\\\", oracle.symbol(oracleData)));\\n    }\\n\\n    function name() external view returns (string memory) {\\n        return string(abi.encodePacked(\\\"Kashi Medium Risk \\\", collateral.safeName(), \\\"/\\\", asset.safeName(), \\\"-\\\", oracle.name(oracleData)));\\n    }\\n\\n    function decimals() external view returns (uint8) {\\n        return asset.safeDecimals();\\n    }\\n\\n    // totalSupply for ERC20 compatibility\\n    function totalSupply() public view returns (uint256) {\\n        return totalAsset.base;\\n    }\\n\\n    // Settings for the Medium Risk KashiPair\\n    uint256 private constant CLOSED_COLLATERIZATION_RATE = 75000; // 75%\\n    uint256 private constant OPEN_COLLATERIZATION_RATE = 77000; // 77%\\n    uint256 private constant COLLATERIZATION_RATE_PRECISION = 1e5; // Must be less than EXCHANGE_RATE_PRECISION (due to optimization in math)\\n    uint256 private constant MINIMUM_TARGET_UTILIZATION = 7e17; // 70%\\n    uint256 private constant MAXIMUM_TARGET_UTILIZATION = 8e17; // 80%\\n    uint256 private constant UTILIZATION_PRECISION = 1e18;\\n    uint256 private constant FULL_UTILIZATION = 1e18;\\n    uint256 private constant FULL_UTILIZATION_MINUS_MAX = FULL_UTILIZATION - MAXIMUM_TARGET_UTILIZATION;\\n    uint256 private constant FACTOR_PRECISION = 1e18;\\n\\n    uint64 private constant STARTING_INTEREST_PER_SECOND = 317097920; // approx 1% APR\\n    uint64 private constant MINIMUM_INTEREST_PER_SECOND = 79274480; // approx 0.25% APR\\n    uint64 private constant MAXIMUM_INTEREST_PER_SECOND = 317097920000; // approx 1000% APR\\n    uint256 private constant INTEREST_ELASTICITY = 28800e36; // Half or double in 28800 seconds (8 hours) if linear\\n\\n    uint256 private constant EXCHANGE_RATE_PRECISION = 1e18;\\n\\n    uint256 private constant LIQUIDATION_MULTIPLIER = 112000; // add 12%\\n    uint256 private constant LIQUIDATION_MULTIPLIER_PRECISION = 1e5;\\n\\n    // Fees\\n    uint256 private constant PROTOCOL_FEE = 10000; // 10%\\n    uint256 private constant PROTOCOL_FEE_DIVISOR = 1e5;\\n    uint256 private constant BORROW_OPENING_FEE = 50; // 0.05%\\n    uint256 private constant BORROW_OPENING_FEE_PRECISION = 1e5;\\n\\n    /// @notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`.\\n    constructor(IBentoBoxV1 bentoBox_) public {\\n        bentoBox = bentoBox_;\\n        masterContract = this;\\n        feeTo = msg.sender;\\n    }\\n\\n    /// @notice Serves as the constructor for clones, as clones can't have a regular constructor\\n    /// @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)\\n    function init(bytes calldata data) public payable override {\\n        require(address(collateral) == address(0), \\\"KashiPair: already initialized\\\");\\n        (collateral, asset, oracle, oracleData) = abi.decode(data, (IERC20, IERC20, IOracle, bytes));\\n        require(address(collateral) != address(0), \\\"KashiPair: bad pair\\\");\\n\\n        accrueInfo.interestPerSecond = uint64(STARTING_INTEREST_PER_SECOND); // 1% APR, with 1e18 being 100%\\n    }\\n\\n    /// @notice Accrues the interest on the borrowed tokens and handles the accumulation of fees.\\n    function accrue() public {\\n        AccrueInfo memory _accrueInfo = accrueInfo;\\n        // Number of seconds since accrue was called\\n        uint256 elapsedTime = block.timestamp - _accrueInfo.lastAccrued;\\n        if (elapsedTime == 0) {\\n            return;\\n        }\\n        _accrueInfo.lastAccrued = uint64(block.timestamp);\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n        if (_totalBorrow.base == 0) {\\n            // If there are no borrows, reset the interest rate\\n            if (_accrueInfo.interestPerSecond != STARTING_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = STARTING_INTEREST_PER_SECOND;\\n                emit LogAccrue(0, 0, STARTING_INTEREST_PER_SECOND, 0);\\n            }\\n            accrueInfo = _accrueInfo;\\n            return;\\n        }\\n\\n        uint256 extraAmount = 0;\\n        uint256 feeFraction = 0;\\n        Rebase memory _totalAsset = totalAsset;\\n\\n        // Accrue interest\\n        extraAmount = uint256(_totalBorrow.elastic).mul(_accrueInfo.interestPerSecond).mul(elapsedTime) / 1e18;\\n        _totalBorrow.elastic = _totalBorrow.elastic.add(extraAmount.to128());\\n        uint256 fullAssetAmount = bentoBox.toAmount(asset, _totalAsset.elastic, false).add(_totalBorrow.elastic);\\n\\n        uint256 feeAmount = extraAmount.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of interest paid goes to fee\\n        feeFraction = feeAmount.mul(_totalAsset.base) / fullAssetAmount;\\n        _accrueInfo.feesEarnedFraction = _accrueInfo.feesEarnedFraction.add(feeFraction.to128());\\n        totalAsset.base = _totalAsset.base.add(feeFraction.to128());\\n        totalBorrow = _totalBorrow;\\n\\n        // Update interest rate\\n        uint256 utilization = uint256(_totalBorrow.elastic).mul(UTILIZATION_PRECISION) / fullAssetAmount;\\n        if (utilization < MINIMUM_TARGET_UTILIZATION) {\\n            uint256 underFactor = MINIMUM_TARGET_UTILIZATION.sub(utilization).mul(FACTOR_PRECISION) / MINIMUM_TARGET_UTILIZATION;\\n            uint256 scale = INTEREST_ELASTICITY.add(underFactor.mul(underFactor).mul(elapsedTime));\\n            _accrueInfo.interestPerSecond = uint64(uint256(_accrueInfo.interestPerSecond).mul(INTEREST_ELASTICITY) / scale);\\n\\n            if (_accrueInfo.interestPerSecond < MINIMUM_INTEREST_PER_SECOND) {\\n                _accrueInfo.interestPerSecond = MINIMUM_INTEREST_PER_SECOND; // 0.25% APR minimum\\n            }\\n        } else if (utilization > MAXIMUM_TARGET_UTILIZATION) {\\n            uint256 overFactor = utilization.sub(MAXIMUM_TARGET_UTILIZATION).mul(FACTOR_PRECISION) / FULL_UTILIZATION_MINUS_MAX;\\n            uint256 scale = INTEREST_ELASTICITY.add(overFactor.mul(overFactor).mul(elapsedTime));\\n            uint256 newInterestPerSecond = uint256(_accrueInfo.interestPerSecond).mul(scale) / INTEREST_ELASTICITY;\\n            if (newInterestPerSecond > MAXIMUM_INTEREST_PER_SECOND) {\\n                newInterestPerSecond = MAXIMUM_INTEREST_PER_SECOND; // 1000% APR maximum\\n            }\\n            _accrueInfo.interestPerSecond = uint64(newInterestPerSecond);\\n        }\\n\\n        emit LogAccrue(extraAmount, feeFraction, _accrueInfo.interestPerSecond, utilization);\\n        accrueInfo = _accrueInfo;\\n    }\\n\\n    /// @notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\\n    /// @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls.\\n    function _isSolvent(\\n        address user,\\n        bool open,\\n        uint256 _exchangeRate\\n    ) internal view returns (bool) {\\n        // accrue must have already been called!\\n        uint256 borrowPart = userBorrowPart[user];\\n        if (borrowPart == 0) return true;\\n        uint256 collateralShare = userCollateralShare[user];\\n        if (collateralShare == 0) return false;\\n\\n        Rebase memory _totalBorrow = totalBorrow;\\n\\n        return\\n            bentoBox.toAmount(\\n                collateral,\\n                collateralShare.mul(EXCHANGE_RATE_PRECISION / COLLATERIZATION_RATE_PRECISION).mul(\\n                    open ? OPEN_COLLATERIZATION_RATE : CLOSED_COLLATERIZATION_RATE\\n                ),\\n                false\\n            ) >=\\n            // Moved exchangeRate here instead of dividing the other side to preserve more precision\\n            borrowPart.mul(_totalBorrow.elastic).mul(_exchangeRate) / _totalBorrow.base;\\n    }\\n\\n    /// @dev Checks if the user is solvent in the closed liquidation case at the end of the function body.\\n    modifier solvent() {\\n        _;\\n        require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n    }\\n\\n    /// @notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\\n    /// This function is supposed to be invoked if needed because Oracle queries can be expensive.\\n    /// @return updated True if `exchangeRate` was updated.\\n    /// @return rate The new exchange rate.\\n    function updateExchangeRate() public returns (bool updated, uint256 rate) {\\n        (updated, rate) = oracle.get(oracleData);\\n\\n        if (updated) {\\n            exchangeRate = rate;\\n            emit LogExchangeRate(rate);\\n        } else {\\n            // Return the old rate if fetching wasn't successful\\n            rate = exchangeRate;\\n        }\\n    }\\n\\n    /// @dev Helper function to move tokens.\\n    /// @param token The ERC-20 token.\\n    /// @param share The amount in shares to add.\\n    /// @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\\n    /// Only used for accounting checks.\\n    /// @param skim If True, only does a balance check on this contract.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    function _addTokens(\\n        IERC20 token,\\n        uint256 share,\\n        uint256 total,\\n        bool skim\\n    ) internal {\\n        if (skim) {\\n            require(share <= bentoBox.balanceOf(token, address(this)).sub(total), \\\"KashiPair: Skim too much\\\");\\n        } else {\\n            bentoBox.transfer(token, msg.sender, address(this), share);\\n        }\\n    }\\n\\n    /// @notice Adds `collateral` from msg.sender to the account `to`.\\n    /// @param to The receiver of the tokens.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add for `to`.\\n    function addCollateral(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public {\\n        userCollateralShare[to] = userCollateralShare[to].add(share);\\n        uint256 oldTotalCollateralShare = totalCollateralShare;\\n        totalCollateralShare = oldTotalCollateralShare.add(share);\\n        _addTokens(collateral, share, oldTotalCollateralShare, skim);\\n        emit LogAddCollateral(skim ? address(bentoBox) : msg.sender, to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeCollateral`.\\n    function _removeCollateral(address to, uint256 share) internal {\\n        userCollateralShare[msg.sender] = userCollateralShare[msg.sender].sub(share);\\n        totalCollateralShare = totalCollateralShare.sub(share);\\n        emit LogRemoveCollateral(msg.sender, to, share);\\n        bentoBox.transfer(collateral, address(this), to, share);\\n    }\\n\\n    /// @notice Removes `share` amount of collateral and transfers it to `to`.\\n    /// @param to The receiver of the shares.\\n    /// @param share Amount of shares to remove.\\n    function removeCollateral(address to, uint256 share) public solvent {\\n        // accrue must be called because we check solvency\\n        accrue();\\n        _removeCollateral(to, share);\\n    }\\n\\n    /// @dev Concrete implementation of `addAsset`.\\n    function _addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) internal returns (uint256 fraction) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 totalAssetShare = _totalAsset.elastic;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        fraction = allShare == 0 ? share : share.mul(_totalAsset.base) / allShare;\\n        if (_totalAsset.base.add(fraction.to128()) < 1000) {\\n            return 0;\\n        }\\n        totalAsset = _totalAsset.add(share, fraction);\\n        balanceOf[to] = balanceOf[to].add(fraction);\\n        _addTokens(asset, share, totalAssetShare, skim);\\n        emit LogAddAsset(skim ? address(bentoBox) : msg.sender, to, share, fraction);\\n    }\\n\\n    /// @notice Adds assets to the lending pair.\\n    /// @param to The address of the user to receive the assets.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param share The amount of shares to add.\\n    /// @return fraction Total fractions added.\\n    function addAsset(\\n        address to,\\n        bool skim,\\n        uint256 share\\n    ) public returns (uint256 fraction) {\\n        accrue();\\n        fraction = _addAsset(to, skim, share);\\n    }\\n\\n    /// @dev Concrete implementation of `removeAsset`.\\n    function _removeAsset(address to, uint256 fraction) internal returns (uint256 share) {\\n        Rebase memory _totalAsset = totalAsset;\\n        uint256 allShare = _totalAsset.elastic + bentoBox.toShare(asset, totalBorrow.elastic, true);\\n        share = fraction.mul(allShare) / _totalAsset.base;\\n        balanceOf[msg.sender] = balanceOf[msg.sender].sub(fraction);\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        _totalAsset.base = _totalAsset.base.sub(fraction.to128());\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        totalAsset = _totalAsset;\\n        emit LogRemoveAsset(msg.sender, to, share, fraction);\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Removes an asset from msg.sender and transfers it to `to`.\\n    /// @param to The user that receives the removed assets.\\n    /// @param fraction The amount/fraction of assets held to remove.\\n    /// @return share The amount of shares transferred to `to`.\\n    function removeAsset(address to, uint256 fraction) public returns (uint256 share) {\\n        accrue();\\n        share = _removeAsset(to, fraction);\\n    }\\n\\n    /// @dev Concrete implementation of `borrow`.\\n    function _borrow(address to, uint256 amount) internal returns (uint256 part, uint256 share) {\\n        uint256 feeAmount = amount.mul(BORROW_OPENING_FEE) / BORROW_OPENING_FEE_PRECISION; // A flat % fee is charged for any borrow\\n\\n        (totalBorrow, part) = totalBorrow.add(amount.add(feeAmount), true);\\n        userBorrowPart[msg.sender] = userBorrowPart[msg.sender].add(part);\\n        emit LogBorrow(msg.sender, to, amount, feeAmount, part);\\n\\n        share = bentoBox.toShare(asset, amount, false);\\n        Rebase memory _totalAsset = totalAsset;\\n        require(_totalAsset.base >= 1000, \\\"Kashi: below minimum\\\");\\n        _totalAsset.elastic = _totalAsset.elastic.sub(share.to128());\\n        totalAsset = _totalAsset;\\n        bentoBox.transfer(asset, address(this), to, share);\\n    }\\n\\n    /// @notice Sender borrows `amount` and transfers it to `to`.\\n    /// @return part Total part of the debt held by borrowers.\\n    /// @return share Total amount in shares borrowed.\\n    function borrow(address to, uint256 amount) public solvent returns (uint256 part, uint256 share) {\\n        accrue();\\n        (part, share) = _borrow(to, amount);\\n    }\\n\\n    /// @dev Concrete implementation of `repay`.\\n    function _repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) internal returns (uint256 amount) {\\n        (totalBorrow, amount) = totalBorrow.sub(part, true);\\n        userBorrowPart[to] = userBorrowPart[to].sub(part);\\n\\n        uint256 share = bentoBox.toShare(asset, amount, true);\\n        uint128 totalShare = totalAsset.elastic;\\n        _addTokens(asset, share, uint256(totalShare), skim);\\n        totalAsset.elastic = totalShare.add(share.to128());\\n        emit LogRepay(skim ? address(bentoBox) : msg.sender, to, amount, part);\\n    }\\n\\n    /// @notice Repays a loan.\\n    /// @param to Address of the user this payment should go.\\n    /// @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\\n    /// False if tokens from msg.sender in `bentoBox` should be transferred.\\n    /// @param part The amount to repay. See `userBorrowPart`.\\n    /// @return amount The total amount repayed.\\n    function repay(\\n        address to,\\n        bool skim,\\n        uint256 part\\n    ) public returns (uint256 amount) {\\n        accrue();\\n        amount = _repay(to, skim, part);\\n    }\\n\\n    // Functions that need accrue to be called\\n    uint8 internal constant ACTION_ADD_ASSET = 1;\\n    uint8 internal constant ACTION_REPAY = 2;\\n    uint8 internal constant ACTION_REMOVE_ASSET = 3;\\n    uint8 internal constant ACTION_REMOVE_COLLATERAL = 4;\\n    uint8 internal constant ACTION_BORROW = 5;\\n    uint8 internal constant ACTION_GET_REPAY_SHARE = 6;\\n    uint8 internal constant ACTION_GET_REPAY_PART = 7;\\n    uint8 internal constant ACTION_ACCRUE = 8;\\n\\n    // Functions that don't need accrue to be called\\n    uint8 internal constant ACTION_ADD_COLLATERAL = 10;\\n    uint8 internal constant ACTION_UPDATE_EXCHANGE_RATE = 11;\\n\\n    // Function on BentoBox\\n    uint8 internal constant ACTION_BENTO_DEPOSIT = 20;\\n    uint8 internal constant ACTION_BENTO_WITHDRAW = 21;\\n    uint8 internal constant ACTION_BENTO_TRANSFER = 22;\\n    uint8 internal constant ACTION_BENTO_TRANSFER_MULTIPLE = 23;\\n    uint8 internal constant ACTION_BENTO_SETAPPROVAL = 24;\\n\\n    // Any external call (except to BentoBox)\\n    uint8 internal constant ACTION_CALL = 30;\\n\\n    int256 internal constant USE_VALUE1 = -1;\\n    int256 internal constant USE_VALUE2 = -2;\\n\\n    /// @dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`.\\n    function _num(\\n        int256 inNum,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal pure returns (uint256 outNum) {\\n        outNum = inNum >= 0 ? uint256(inNum) : (inNum == USE_VALUE1 ? value1 : value2);\\n    }\\n\\n    /// @dev Helper function for depositing into `bentoBox`.\\n    function _bentoDeposit(\\n        bytes memory data,\\n        uint256 value,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        amount = int256(_num(amount, value1, value2)); // Done this way to avoid stack too deep errors\\n        share = int256(_num(share, value1, value2));\\n        return bentoBox.deposit{value: value}(token, msg.sender, to, uint256(amount), uint256(share));\\n    }\\n\\n    /// @dev Helper function to withdraw from the `bentoBox`.\\n    function _bentoWithdraw(\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (uint256, uint256) {\\n        (IERC20 token, address to, int256 amount, int256 share) = abi.decode(data, (IERC20, address, int256, int256));\\n        return bentoBox.withdraw(token, msg.sender, to, _num(amount, value1, value2), _num(share, value1, value2));\\n    }\\n\\n    /// @dev Helper function to perform a contract call and eventually extracting revert messages on failure.\\n    /// Calls to `bentoBox` are not allowed for obvious security reasons.\\n    /// This also means that calls made from this contract shall *not* be trusted.\\n    function _call(\\n        uint256 value,\\n        bytes memory data,\\n        uint256 value1,\\n        uint256 value2\\n    ) internal returns (bytes memory, uint8) {\\n        (address callee, bytes memory callData, bool useValue1, bool useValue2, uint8 returnValues) =\\n            abi.decode(data, (address, bytes, bool, bool, uint8));\\n\\n        if (useValue1 && !useValue2) {\\n            callData = abi.encodePacked(callData, value1);\\n        } else if (!useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value2);\\n        } else if (useValue1 && useValue2) {\\n            callData = abi.encodePacked(callData, value1, value2);\\n        }\\n\\n        require(callee != address(bentoBox) && callee != address(this), \\\"KashiPair: can't call\\\");\\n\\n        (bool success, bytes memory returnData) = callee.call{value: value}(callData);\\n        require(success, \\\"KashiPair: call failed\\\");\\n        return (returnData, returnValues);\\n    }\\n\\n    struct CookStatus {\\n        bool needsSolvencyCheck;\\n        bool hasAccrued;\\n    }\\n\\n    /// @notice Executes a set of actions and allows composability (contract calls) to other contracts.\\n    /// @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\\n    /// @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\\n    /// Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\\n    /// @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\\n    /// @return value1 May contain the first positioned return value of the last executed action (if applicable).\\n    /// @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable).\\n    function cook(\\n        uint8[] calldata actions,\\n        uint256[] calldata values,\\n        bytes[] calldata datas\\n    ) external payable returns (uint256 value1, uint256 value2) {\\n        CookStatus memory status;\\n        for (uint256 i = 0; i < actions.length; i++) {\\n            uint8 action = actions[i];\\n            if (!status.hasAccrued && action < 10) {\\n                accrue();\\n                status.hasAccrued = true;\\n            }\\n            if (action == ACTION_ADD_COLLATERAL) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                addCollateral(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_ADD_ASSET) {\\n                (int256 share, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                value1 = _addAsset(to, skim, _num(share, value1, value2));\\n            } else if (action == ACTION_REPAY) {\\n                (int256 part, address to, bool skim) = abi.decode(datas[i], (int256, address, bool));\\n                _repay(to, skim, _num(part, value1, value2));\\n            } else if (action == ACTION_REMOVE_ASSET) {\\n                (int256 fraction, address to) = abi.decode(datas[i], (int256, address));\\n                value1 = _removeAsset(to, _num(fraction, value1, value2));\\n            } else if (action == ACTION_REMOVE_COLLATERAL) {\\n                (int256 share, address to) = abi.decode(datas[i], (int256, address));\\n                _removeCollateral(to, _num(share, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_BORROW) {\\n                (int256 amount, address to) = abi.decode(datas[i], (int256, address));\\n                (value1, value2) = _borrow(to, _num(amount, value1, value2));\\n                status.needsSolvencyCheck = true;\\n            } else if (action == ACTION_UPDATE_EXCHANGE_RATE) {\\n                (bool must_update, uint256 minRate, uint256 maxRate) = abi.decode(datas[i], (bool, uint256, uint256));\\n                (bool updated, uint256 rate) = updateExchangeRate();\\n                require((!must_update || updated) && rate > minRate && (maxRate == 0 || rate > maxRate), \\\"KashiPair: rate not ok\\\");\\n            } else if (action == ACTION_BENTO_SETAPPROVAL) {\\n                (address user, address _masterContract, bool approved, uint8 v, bytes32 r, bytes32 s) =\\n                    abi.decode(datas[i], (address, address, bool, uint8, bytes32, bytes32));\\n                bentoBox.setMasterContractApproval(user, _masterContract, approved, v, r, s);\\n            } else if (action == ACTION_BENTO_DEPOSIT) {\\n                (value1, value2) = _bentoDeposit(datas[i], values[i], value1, value2);\\n            } else if (action == ACTION_BENTO_WITHDRAW) {\\n                (value1, value2) = _bentoWithdraw(datas[i], value1, value2);\\n            } else if (action == ACTION_BENTO_TRANSFER) {\\n                (IERC20 token, address to, int256 share) = abi.decode(datas[i], (IERC20, address, int256));\\n                bentoBox.transfer(token, msg.sender, to, _num(share, value1, value2));\\n            } else if (action == ACTION_BENTO_TRANSFER_MULTIPLE) {\\n                (IERC20 token, address[] memory tos, uint256[] memory shares) = abi.decode(datas[i], (IERC20, address[], uint256[]));\\n                bentoBox.transferMultiple(token, msg.sender, tos, shares);\\n            } else if (action == ACTION_CALL) {\\n                (bytes memory returnData, uint8 returnValues) = _call(values[i], datas[i], value1, value2);\\n\\n                if (returnValues == 1) {\\n                    (value1) = abi.decode(returnData, (uint256));\\n                } else if (returnValues == 2) {\\n                    (value1, value2) = abi.decode(returnData, (uint256, uint256));\\n                }\\n            } else if (action == ACTION_GET_REPAY_SHARE) {\\n                int256 part = abi.decode(datas[i], (int256));\\n                value1 = bentoBox.toShare(asset, totalBorrow.toElastic(_num(part, value1, value2), true), true);\\n            } else if (action == ACTION_GET_REPAY_PART) {\\n                int256 amount = abi.decode(datas[i], (int256));\\n                value1 = totalBorrow.toBase(_num(amount, value1, value2), false);\\n            }\\n        }\\n\\n        if (status.needsSolvencyCheck) {\\n            require(_isSolvent(msg.sender, false, exchangeRate), \\\"KashiPair: user insolvent\\\");\\n        }\\n    }\\n\\n    /// @notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\\n    /// @param users An array of user addresses.\\n    /// @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\\n    /// @param to Address of the receiver in open liquidations if `swapper` is zero.\\n    /// @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\\n    /// @param open True to perform a open liquidation else False.\\n    function liquidate(\\n        address[] calldata users,\\n        uint256[] calldata maxBorrowParts,\\n        address to,\\n        ISwapper swapper,\\n        bool open\\n    ) public {\\n        // Oracle can fail but we still need to allow liquidations\\n        (, uint256 _exchangeRate) = updateExchangeRate();\\n        accrue();\\n\\n        uint256 allCollateralShare;\\n        uint256 allBorrowAmount;\\n        uint256 allBorrowPart;\\n        Rebase memory _totalBorrow = totalBorrow;\\n        Rebase memory bentoBoxTotals = bentoBox.totals(collateral);\\n        for (uint256 i = 0; i < users.length; i++) {\\n            address user = users[i];\\n            if (!_isSolvent(user, open, _exchangeRate)) {\\n                uint256 borrowPart;\\n                {\\n                    uint256 availableBorrowPart = userBorrowPart[user];\\n                    borrowPart = maxBorrowParts[i] > availableBorrowPart ? availableBorrowPart : maxBorrowParts[i];\\n                    userBorrowPart[user] = availableBorrowPart.sub(borrowPart);\\n                }\\n                uint256 borrowAmount = _totalBorrow.toElastic(borrowPart, false);\\n                uint256 collateralShare =\\n                    bentoBoxTotals.toBase(\\n                        borrowAmount.mul(LIQUIDATION_MULTIPLIER).mul(_exchangeRate) /\\n                            (LIQUIDATION_MULTIPLIER_PRECISION * EXCHANGE_RATE_PRECISION),\\n                        false\\n                    );\\n\\n                userCollateralShare[user] = userCollateralShare[user].sub(collateralShare);\\n                emit LogRemoveCollateral(user, swapper == ISwapper(0) ? to : address(swapper), collateralShare);\\n                emit LogRepay(swapper == ISwapper(0) ? msg.sender : address(swapper), user, borrowAmount, borrowPart);\\n\\n                // Keep totals\\n                allCollateralShare = allCollateralShare.add(collateralShare);\\n                allBorrowAmount = allBorrowAmount.add(borrowAmount);\\n                allBorrowPart = allBorrowPart.add(borrowPart);\\n            }\\n        }\\n        require(allBorrowAmount != 0, \\\"KashiPair: all are solvent\\\");\\n        _totalBorrow.elastic = _totalBorrow.elastic.sub(allBorrowAmount.to128());\\n        _totalBorrow.base = _totalBorrow.base.sub(allBorrowPart.to128());\\n        totalBorrow = _totalBorrow;\\n        totalCollateralShare = totalCollateralShare.sub(allCollateralShare);\\n\\n        uint256 allBorrowShare = bentoBox.toShare(asset, allBorrowAmount, true);\\n\\n        if (!open) {\\n            // Closed liquidation using a pre-approved swapper for the benefit of the LPs\\n            require(masterContract.swappers(swapper), \\\"KashiPair: Invalid swapper\\\");\\n\\n            // Swaps the users' collateral for the borrowed asset\\n            bentoBox.transfer(collateral, address(this), address(swapper), allCollateralShare);\\n            swapper.swap(collateral, asset, address(this), allBorrowShare, allCollateralShare);\\n\\n            uint256 returnedShare = bentoBox.balanceOf(asset, address(this)).sub(uint256(totalAsset.elastic));\\n            uint256 extraShare = returnedShare.sub(allBorrowShare);\\n            uint256 feeShare = extraShare.mul(PROTOCOL_FEE) / PROTOCOL_FEE_DIVISOR; // % of profit goes to fee\\n            // solhint-disable-next-line reentrancy\\n            bentoBox.transfer(asset, address(this), masterContract.feeTo(), feeShare);\\n            totalAsset.elastic = totalAsset.elastic.add(returnedShare.sub(feeShare).to128());\\n            emit LogAddAsset(address(swapper), address(this), extraShare.sub(feeShare), 0);\\n        } else {\\n            // Swap using a swapper freely chosen by the caller\\n            // Open (flash) liquidation: get proceeds first and provide the borrow after\\n            bentoBox.transfer(collateral, address(this), swapper == ISwapper(0) ? to : address(swapper), allCollateralShare);\\n            if (swapper != ISwapper(0)) {\\n                swapper.swap(collateral, asset, msg.sender, allBorrowShare, allCollateralShare);\\n            }\\n\\n            bentoBox.transfer(asset, msg.sender, address(this), allBorrowShare);\\n            totalAsset.elastic = totalAsset.elastic.add(allBorrowShare.to128());\\n        }\\n    }\\n\\n    /// @notice Withdraws the fees accumulated.\\n    function withdrawFees() public {\\n        accrue();\\n        address _feeTo = masterContract.feeTo();\\n        uint256 _feesEarnedFraction = accrueInfo.feesEarnedFraction;\\n        balanceOf[_feeTo] = balanceOf[_feeTo].add(_feesEarnedFraction);\\n        accrueInfo.feesEarnedFraction = 0;\\n\\n        emit LogWithdrawFees(_feeTo, _feesEarnedFraction);\\n    }\\n\\n    /// @notice Used to register and enable or disable swapper contracts used in closed liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param swapper The address of the swapper contract that conforms to `ISwapper`.\\n    /// @param enable True to enable the swapper. To disable use False.\\n    function setSwapper(ISwapper swapper, bool enable) public onlyOwner {\\n        swappers[swapper] = enable;\\n    }\\n\\n    /// @notice Sets the beneficiary of fees accrued in liquidations.\\n    /// MasterContract Only Admin function.\\n    /// @param newFeeTo The address of the receiver.\\n    function setFeeTo(address newFeeTo) public onlyOwner {\\n        feeTo = newFeeTo;\\n        emit LogFeeTo(newFeeTo);\\n    }\\n}\\n\",\"keccak256\":\"0x637ccd115a50407c1bce3c423882a40d7a94109674938d784540e130f46db230\",\"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/bentobox/KashiPairMediumRiskV1.sol": {
        "ast": {
          "absolutePath": "contracts/bentobox/KashiPairMediumRiskV1.sol",
          "exportedSymbols": {
            "BoringERC20": [
              1323
            ],
            "BoringMath": [
              154
            ],
            "BoringMath128": [
              200
            ],
            "BoringOwnable": [
              328
            ],
            "BoringOwnableData": [
              205
            ],
            "Domain": [
              418
            ],
            "ERC20": [
              741
            ],
            "ERC20Data": [
              436
            ],
            "IBatchFlashBorrower": [
              1340
            ],
            "IBentoBoxV1": [
              1796
            ],
            "IERC20": [
              1118
            ],
            "IFlashBorrower": [
              1354
            ],
            "IMasterContract": [
              748
            ],
            "IOracle": [
              1841
            ],
            "IStrategy": [
              1383
            ],
            "ISwapper": [
              1880
            ],
            "KashiPairMediumRiskV1": [
              4810
            ],
            "Rebase": [
              753
            ],
            "RebaseLibrary": [
              1053
            ]
          },
          "id": 4811,
          "license": "UNLICENSED",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "718:23:0"
            },
            {
              "id": 2,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "742:33:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 3,
                "nodeType": "StructuredDocumentation",
                "src": "1001: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": 154,
              "linearizedBaseContracts": [
                154
              ],
              "name": "BoringMath",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 24,
                    "nodeType": "Block",
                    "src": "1246:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 20,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 17,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 13,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10,
                                      "src": "1265:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 16,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 14,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 5,
                                        "src": "1269:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 15,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 7,
                                        "src": "1273:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "1269:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "1265:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "id": 18,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "1264:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 19,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7,
                                "src": "1279:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "1264:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 21,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1282: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": 12,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1256:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 22,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1256:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23,
                        "nodeType": "ExpressionStatement",
                        "src": "1256:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 25,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25,
                        "src": "1190:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1190:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25,
                        "src": "1201:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1201:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1189:22:0"
                  },
                  "returnParameters": {
                    "id": 11,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25,
                        "src": "1235:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1235:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1234:11:0"
                  },
                  "scope": 154,
                  "src": "1177:139:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 46,
                    "nodeType": "Block",
                    "src": "1391:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 42,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 39,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 35,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 32,
                                      "src": "1410:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 38,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 36,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 27,
                                        "src": "1414:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 37,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 29,
                                        "src": "1418:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "1414:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "1410:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "id": 40,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "1409:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 41,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 27,
                                "src": "1424:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "1409:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 43,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1427: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": 34,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1401:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 44,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1401:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 45,
                        "nodeType": "ExpressionStatement",
                        "src": "1401:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 47,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 30,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 27,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 47,
                        "src": "1335:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 26,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1335:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 29,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 47,
                        "src": "1346:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 28,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1346:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1334:22:0"
                  },
                  "returnParameters": {
                    "id": 33,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 32,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 47,
                        "src": "1380:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 31,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1380:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1379:11:0"
                  },
                  "scope": 154,
                  "src": "1322:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 74,
                    "nodeType": "Block",
                    "src": "1533:84:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 70,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 59,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 57,
                                  "name": "b",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 51,
                                  "src": "1551:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 58,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1556:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "1551:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 69,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 67,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "id": 64,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "id": 60,
                                          "name": "c",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 54,
                                          "src": "1562:1:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 63,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 61,
                                            "name": "a",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 49,
                                            "src": "1566:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "*",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 62,
                                            "name": "b",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 51,
                                            "src": "1570:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "1566:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "1562:9:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "id": 65,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "1561:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 66,
                                    "name": "b",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 51,
                                    "src": "1575:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "1561:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 68,
                                  "name": "a",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 49,
                                  "src": "1580:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "1561:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "1551:30:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a204d756c204f766572666c6f77",
                              "id": 71,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1583: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": 56,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1543:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 72,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1543:67:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 73,
                        "nodeType": "ExpressionStatement",
                        "src": "1543:67:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 75,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mul",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 52,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 49,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 75,
                        "src": "1477:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 48,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1477:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 51,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 75,
                        "src": "1488:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 50,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1488:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1476:22:0"
                  },
                  "returnParameters": {
                    "id": 55,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 54,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 75,
                        "src": "1522:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 53,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1522:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1521:11:0"
                  },
                  "scope": 154,
                  "src": "1464:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 100,
                    "nodeType": "Block",
                    "src": "1683:98:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 89,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 83,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 77,
                                "src": "1701:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 87,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "1714:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 86,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "1715: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": 85,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1706:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint128_$",
                                    "typeString": "type(uint128)"
                                  },
                                  "typeName": {
                                    "id": 84,
                                    "name": "uint128",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1706:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 88,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1706:11:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "1701:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e74313238204f766572666c6f77",
                              "id": 90,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1719: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": 82,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1693:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 91,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1693:57:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 92,
                        "nodeType": "ExpressionStatement",
                        "src": "1693:57:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 98,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 93,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 80,
                            "src": "1760:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 96,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 77,
                                "src": "1772:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 95,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "1764:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint128_$",
                                "typeString": "type(uint128)"
                              },
                              "typeName": {
                                "id": 94,
                                "name": "uint128",
                                "nodeType": "ElementaryTypeName",
                                "src": "1764:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 97,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1764:10:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "1760:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 99,
                        "nodeType": "ExpressionStatement",
                        "src": "1760:14:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 101,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to128",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 78,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 77,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 101,
                        "src": "1638:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 76,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1638:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1637:11:0"
                  },
                  "returnParameters": {
                    "id": 81,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 80,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 101,
                        "src": "1672:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 79,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "1672:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1671:11:0"
                  },
                  "scope": 154,
                  "src": "1623:158:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 126,
                    "nodeType": "Block",
                    "src": "1845:95:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 115,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 109,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 103,
                                "src": "1863:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 113,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "1875:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 112,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "1876: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": 111,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1868:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint64_$",
                                    "typeString": "type(uint64)"
                                  },
                                  "typeName": {
                                    "id": 110,
                                    "name": "uint64",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1868:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 114,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1868:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "src": "1863:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e743634204f766572666c6f77",
                              "id": 116,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1880: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": 108,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1855:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 117,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1855:55:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 118,
                        "nodeType": "ExpressionStatement",
                        "src": "1855:55:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 124,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 119,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 106,
                            "src": "1920:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 122,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 103,
                                "src": "1931:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 121,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "1924:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 120,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "1924:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 123,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1924:9:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "src": "1920:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "id": 125,
                        "nodeType": "ExpressionStatement",
                        "src": "1920:13:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 127,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to64",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 104,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 103,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 127,
                        "src": "1801:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 102,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1801:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1800:11:0"
                  },
                  "returnParameters": {
                    "id": 107,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 106,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 127,
                        "src": "1835:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 105,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "1835:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1834:10:0"
                  },
                  "scope": 154,
                  "src": "1787:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 152,
                    "nodeType": "Block",
                    "src": "2004:95:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 141,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 135,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 129,
                                "src": "2022:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 139,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "2034:2:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 138,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "2035: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": 137,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2027:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint32_$",
                                    "typeString": "type(uint32)"
                                  },
                                  "typeName": {
                                    "id": 136,
                                    "name": "uint32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2027:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 140,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2027:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "src": "2022:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a2075696e743332204f766572666c6f77",
                              "id": 142,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2039: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": 134,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2014:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2014:55:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 144,
                        "nodeType": "ExpressionStatement",
                        "src": "2014:55:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 150,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 145,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 132,
                            "src": "2079:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 148,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 129,
                                "src": "2090:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 147,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "2083:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint32_$",
                                "typeString": "type(uint32)"
                              },
                              "typeName": {
                                "id": 146,
                                "name": "uint32",
                                "nodeType": "ElementaryTypeName",
                                "src": "2083:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 149,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2083:9:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "2079:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 151,
                        "nodeType": "ExpressionStatement",
                        "src": "2079:13:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 153,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "to32",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 130,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 129,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 153,
                        "src": "1960:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 128,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1960:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1959:11:0"
                  },
                  "returnParameters": {
                    "id": 133,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 132,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 153,
                        "src": "1994:8:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 131,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1994:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1993:10:0"
                  },
                  "scope": 154,
                  "src": "1946:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 4811,
              "src": "1152:949:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 155,
                "nodeType": "StructuredDocumentation",
                "src": "2103:99:0",
                "text": "@notice A library for performing overflow-/underflow-safe addition and subtraction on uint128."
              },
              "fullyImplemented": true,
              "id": 200,
              "linearizedBaseContracts": [
                200
              ],
              "name": "BoringMath128",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 176,
                    "nodeType": "Block",
                    "src": "2299:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              "id": 172,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 169,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 165,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 162,
                                      "src": "2318:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      },
                                      "id": 168,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 166,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 157,
                                        "src": "2322:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "+",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 167,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 159,
                                        "src": "2326:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "src": "2322:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "2318:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "id": 170,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "2317:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 171,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 159,
                                "src": "2332:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "2317:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20416464204f766572666c6f77",
                              "id": 173,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2335: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": 164,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2309:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 174,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2309:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 175,
                        "nodeType": "ExpressionStatement",
                        "src": "2309:53:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 177,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 160,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 157,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 177,
                        "src": "2243:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 156,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "2243:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 159,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 177,
                        "src": "2254:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 158,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "2254:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2242:22:0"
                  },
                  "returnParameters": {
                    "id": 163,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 162,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 177,
                        "src": "2288:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 161,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "2288:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2287:11:0"
                  },
                  "scope": 200,
                  "src": "2230:139:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 198,
                    "nodeType": "Block",
                    "src": "2444:67:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              "id": 194,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 191,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 187,
                                      "name": "c",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 184,
                                      "src": "2463:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      },
                                      "id": 190,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 188,
                                        "name": "a",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 179,
                                        "src": "2467:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 189,
                                        "name": "b",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 181,
                                        "src": "2471:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      },
                                      "src": "2467:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "2463:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "id": 192,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "2462:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 193,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 179,
                                "src": "2477:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "src": "2462:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "426f72696e674d6174683a20556e646572666c6f77",
                              "id": 195,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2480: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": 186,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2454:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 196,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2454:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 197,
                        "nodeType": "ExpressionStatement",
                        "src": "2454:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 199,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 182,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 179,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 199,
                        "src": "2388:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 178,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "2388:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 181,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 199,
                        "src": "2399:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 180,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "2399:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2387:22:0"
                  },
                  "returnParameters": {
                    "id": 185,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 184,
                        "mutability": "mutable",
                        "name": "c",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 199,
                        "src": "2433:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 183,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "2433:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2432:11:0"
                  },
                  "scope": 200,
                  "src": "2375:136:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 4811,
              "src": "2202:311:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 205,
              "linearizedBaseContracts": [
                205
              ],
              "name": "BoringOwnableData",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "8da5cb5b",
                  "id": 202,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 205,
                  "src": "2847:20:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 201,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2847:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "e30c3978",
                  "id": 204,
                  "mutability": "mutable",
                  "name": "pendingOwner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 205,
                  "src": "2873:27:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 203,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2873:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                }
              ],
              "scope": 4811,
              "src": "2814:89:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 206,
                    "name": "BoringOwnableData",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 205,
                    "src": "2931:17:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringOwnableData_$205",
                      "typeString": "contract BoringOwnableData"
                    }
                  },
                  "id": 207,
                  "nodeType": "InheritanceSpecifier",
                  "src": "2931:17:0"
                }
              ],
              "contractDependencies": [
                205
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 328,
              "linearizedBaseContracts": [
                328,
                205
              ],
              "name": "BoringOwnable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 213,
                  "name": "OwnershipTransferred",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 212,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 209,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "previousOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 213,
                        "src": "2982:29:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 208,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2982:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 211,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 213,
                        "src": "3013:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 210,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3013:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2981:57:0"
                  },
                  "src": "2955:84:0"
                },
                {
                  "body": {
                    "id": 231,
                    "nodeType": "Block",
                    "src": "3130:94:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 220,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 217,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 202,
                            "src": "3140:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 218,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "3148:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 219,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3148:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "3140:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 221,
                        "nodeType": "ExpressionStatement",
                        "src": "3140:18:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 225,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3202: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": 224,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3194:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 223,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3194:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 226,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3194:10:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 227,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "3206:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 228,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3206: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": 222,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 213,
                            "src": "3173:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 229,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3173:44:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 230,
                        "nodeType": "EmitStatement",
                        "src": "3168:49:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 214,
                    "nodeType": "StructuredDocumentation",
                    "src": "3045:59:0",
                    "text": "@notice `owner` defaults to msg.sender on construction."
                  },
                  "id": 232,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 215,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3120:2:0"
                  },
                  "returnParameters": {
                    "id": 216,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3130:0:0"
                  },
                  "scope": 328,
                  "src": "3109:115:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 280,
                    "nodeType": "Block",
                    "src": "3803:369:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 244,
                          "name": "direct",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 237,
                          "src": "3817:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 278,
                          "nodeType": "Block",
                          "src": "4095:71:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 276,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 274,
                                  "name": "pendingOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 204,
                                  "src": "4132:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 275,
                                  "name": "newOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 235,
                                  "src": "4147:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "4132:23:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 277,
                              "nodeType": "ExpressionStatement",
                              "src": "4132:23:0"
                            }
                          ]
                        },
                        "id": 279,
                        "nodeType": "IfStatement",
                        "src": "3813:353:0",
                        "trueBody": {
                          "id": 273,
                          "nodeType": "Block",
                          "src": "3825:264:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "id": 253,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      "id": 251,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 246,
                                        "name": "newOwner",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 235,
                                        "src": "3869:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "!=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "30",
                                            "id": 249,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "3889: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": 248,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "3881:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_address_$",
                                            "typeString": "type(address)"
                                          },
                                          "typeName": {
                                            "id": 247,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "3881:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 250,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3881:10:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      },
                                      "src": "3869:22:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "||",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 252,
                                      "name": "renounce",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 239,
                                      "src": "3895:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "src": "3869:34:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4f776e61626c653a207a65726f2061646472657373",
                                    "id": 254,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3905: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": 245,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "3861:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 255,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3861:68:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 256,
                              "nodeType": "ExpressionStatement",
                              "src": "3861:68:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 258,
                                    "name": "owner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 202,
                                    "src": "3993:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 259,
                                    "name": "newOwner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 235,
                                    "src": "4000:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 257,
                                  "name": "OwnershipTransferred",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 213,
                                  "src": "3972:20:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                                    "typeString": "function (address,address)"
                                  }
                                },
                                "id": 260,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3972:37:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 261,
                              "nodeType": "EmitStatement",
                              "src": "3967:42:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 264,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 262,
                                  "name": "owner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 202,
                                  "src": "4023:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 263,
                                  "name": "newOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 235,
                                  "src": "4031:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "4023:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 265,
                              "nodeType": "ExpressionStatement",
                              "src": "4023:16:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 271,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 266,
                                  "name": "pendingOwner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 204,
                                  "src": "4053:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 269,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "4076: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": 268,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "4068:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 267,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "4068:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 270,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "4068:10:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "4053:25:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 272,
                              "nodeType": "ExpressionStatement",
                              "src": "4053:25:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 233,
                    "nodeType": "StructuredDocumentation",
                    "src": "3230: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": 281,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 242,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 241,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 327,
                        "src": "3793:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "3793:9:0"
                    }
                  ],
                  "name": "transferOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 240,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 235,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 281,
                        "src": "3719:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 234,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3719:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 237,
                        "mutability": "mutable",
                        "name": "direct",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 281,
                        "src": "3745:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 236,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3745:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 239,
                        "mutability": "mutable",
                        "name": "renounce",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 281,
                        "src": "3766:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 238,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3766:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3709:76:0"
                  },
                  "returnParameters": {
                    "id": 243,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3803:0:0"
                  },
                  "scope": 328,
                  "src": "3683:489:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 313,
                    "nodeType": "Block",
                    "src": "4284:297:0",
                    "statements": [
                      {
                        "assignments": [
                          286
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 286,
                            "mutability": "mutable",
                            "name": "_pendingOwner",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 313,
                            "src": "4294:21:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 285,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "4294:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 288,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 287,
                          "name": "pendingOwner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 204,
                          "src": "4318:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4294:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 293,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 290,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "4367:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 291,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4367:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 292,
                                "name": "_pendingOwner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 286,
                                "src": "4381:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "4367:27:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572",
                              "id": 294,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4396: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": 289,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4359:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 295,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4359:72:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 296,
                        "nodeType": "ExpressionStatement",
                        "src": "4359:72:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 298,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 202,
                              "src": "4487:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 299,
                              "name": "_pendingOwner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 286,
                              "src": "4494:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 297,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 213,
                            "src": "4466:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 300,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4466:42:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 301,
                        "nodeType": "EmitStatement",
                        "src": "4461:47:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 304,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 302,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 202,
                            "src": "4518:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 303,
                            "name": "_pendingOwner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 286,
                            "src": "4526:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "4518:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 305,
                        "nodeType": "ExpressionStatement",
                        "src": "4518:21:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 311,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 306,
                            "name": "pendingOwner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 204,
                            "src": "4549:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 309,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4572: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": 308,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "4564:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 307,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "4564:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 310,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4564:10:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "4549:25:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 312,
                        "nodeType": "ExpressionStatement",
                        "src": "4549:25:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 282,
                    "nodeType": "StructuredDocumentation",
                    "src": "4178:68:0",
                    "text": "@notice Needs to be called by `pendingOwner` to claim ownership."
                  },
                  "functionSelector": "4e71e0c8",
                  "id": 314,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 283,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4274:2:0"
                  },
                  "returnParameters": {
                    "id": 284,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4284:0:0"
                  },
                  "scope": 328,
                  "src": "4251:330:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 326,
                    "nodeType": "Block",
                    "src": "4673:92:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 321,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 318,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "4691:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 319,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4691:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 320,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 202,
                                "src": "4705:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "4691:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",
                              "id": 322,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4712: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": 317,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4683:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 323,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4683:64:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 324,
                        "nodeType": "ExpressionStatement",
                        "src": "4683:64:0"
                      },
                      {
                        "id": 325,
                        "nodeType": "PlaceholderStatement",
                        "src": "4757:1:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 315,
                    "nodeType": "StructuredDocumentation",
                    "src": "4587:60:0",
                    "text": "@notice Only allows the `owner` to execute the function."
                  },
                  "id": 327,
                  "name": "onlyOwner",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 316,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4670:2:0"
                  },
                  "src": "4652:113:0",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 4811,
              "src": "2905:1862:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 418,
              "linearizedBaseContracts": [
                418
              ],
              "name": "Domain",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "id": 333,
                  "mutability": "constant",
                  "name": "DOMAIN_SEPARATOR_SIGNATURE_HASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 418,
                  "src": "5096:127:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 329,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5096:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "454950373132446f6d61696e2875696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429",
                        "id": 331,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5165:57:0",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218",
                          "typeString": "literal_string \"EIP712Domain(uint256 chainId,address verifyingContract)\""
                        },
                        "value": "EIP712Domain(uint256 chainId,address verifyingContract)"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218",
                          "typeString": "literal_string \"EIP712Domain(uint256 chainId,address verifyingContract)\""
                        }
                      ],
                      "id": 330,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -8,
                      "src": "5155:9:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 332,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5155:68:0",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 336,
                  "mutability": "constant",
                  "name": "EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 418,
                  "src": "5279:77:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 334,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "5279:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "1901",
                    "id": 335,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "5346:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                      "typeString": "literal_string \"\u0019\u0001\""
                    },
                    "value": "\u0019\u0001"
                  },
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 338,
                  "mutability": "immutable",
                  "name": "_DOMAIN_SEPARATOR",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 418,
                  "src": "5405:43:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 337,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5405:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 340,
                  "mutability": "immutable",
                  "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 418,
                  "src": "5454:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 339,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5454:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 360,
                    "nodeType": "Block",
                    "src": "5639:102:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 351,
                                  "name": "DOMAIN_SEPARATOR_SIGNATURE_HASH",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 333,
                                  "src": "5677:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 352,
                                  "name": "chainId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 343,
                                  "src": "5710:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 355,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "5727:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_Domain_$418",
                                        "typeString": "contract Domain"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_Domain_$418",
                                        "typeString": "contract Domain"
                                      }
                                    ],
                                    "id": 354,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "5719:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 353,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "5719:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 356,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "5719:13:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 349,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5666:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 350,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encode",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5666:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 357,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5666:67:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 348,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "5656:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 358,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5656:78:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 347,
                        "id": 359,
                        "nodeType": "Return",
                        "src": "5649:85:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 341,
                    "nodeType": "StructuredDocumentation",
                    "src": "5512:39:0",
                    "text": "@dev Calculate the DOMAIN_SEPARATOR"
                  },
                  "id": 361,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_calculateDomainSeparator",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 344,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 343,
                        "mutability": "mutable",
                        "name": "chainId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 361,
                        "src": "5591:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 342,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5591:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5590:17:0"
                  },
                  "returnParameters": {
                    "id": 347,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 346,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 361,
                        "src": "5630:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 345,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5630:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5629:9:0"
                  },
                  "scope": 418,
                  "src": "5556:185:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 376,
                    "nodeType": "Block",
                    "src": "5768:186:0",
                    "statements": [
                      {
                        "assignments": [
                          365
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 365,
                            "mutability": "mutable",
                            "name": "chainId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 376,
                            "src": "5778:15:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 364,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5778:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 366,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5778:15:0"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "5812:44:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "5826:20:0",
                              "value": {
                                "arguments": [],
                                "functionName": {
                                  "name": "chainid",
                                  "nodeType": "YulIdentifier",
                                  "src": "5837:7:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "5837:9:0"
                              },
                              "variableNames": [
                                {
                                  "name": "chainId",
                                  "nodeType": "YulIdentifier",
                                  "src": "5826:7:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 365,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "5826:7:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 367,
                        "nodeType": "InlineAssembly",
                        "src": "5803:53:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 374,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 368,
                            "name": "_DOMAIN_SEPARATOR",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 338,
                            "src": "5865:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 372,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 370,
                                  "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 340,
                                  "src": "5911:25:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 371,
                                  "name": "chainId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 365,
                                  "src": "5939:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "5911:35:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 369,
                              "name": "_calculateDomainSeparator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 361,
                              "src": "5885:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bytes32_$",
                                "typeString": "function (uint256) view returns (bytes32)"
                              }
                            },
                            "id": 373,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "5885:62:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "5865:82:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 375,
                        "nodeType": "ExpressionStatement",
                        "src": "5865:82:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 377,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 362,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5758:2:0"
                  },
                  "returnParameters": {
                    "id": 363,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5768:0:0"
                  },
                  "scope": 418,
                  "src": "5747:207:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 396,
                    "nodeType": "Block",
                    "src": "6313:204:0",
                    "statements": [
                      {
                        "assignments": [
                          384
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 384,
                            "mutability": "mutable",
                            "name": "chainId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 396,
                            "src": "6323:15:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 383,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "6323:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 385,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6323:15:0"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "6357:44:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "6371:20:0",
                              "value": {
                                "arguments": [],
                                "functionName": {
                                  "name": "chainid",
                                  "nodeType": "YulIdentifier",
                                  "src": "6382:7:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "6382:9:0"
                              },
                              "variableNames": [
                                {
                                  "name": "chainId",
                                  "nodeType": "YulIdentifier",
                                  "src": "6371:7:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 384,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "6371:7:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 386,
                        "nodeType": "InlineAssembly",
                        "src": "6348:53:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 389,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 387,
                              "name": "chainId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 384,
                              "src": "6417:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 388,
                              "name": "DOMAIN_SEPARATOR_CHAIN_ID",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 340,
                              "src": "6428:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "6417:36:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 392,
                                "name": "chainId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 384,
                                "src": "6502:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 391,
                              "name": "_calculateDomainSeparator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 361,
                              "src": "6476:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bytes32_$",
                                "typeString": "function (uint256) view returns (bytes32)"
                              }
                            },
                            "id": 393,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6476:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "id": 394,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "6417:93:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 390,
                            "name": "_DOMAIN_SEPARATOR",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 338,
                            "src": "6456:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 382,
                        "id": 395,
                        "nodeType": "Return",
                        "src": "6410:100:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 378,
                    "nodeType": "StructuredDocumentation",
                    "src": "5960:36:0",
                    "text": "@dev Return the DOMAIN_SEPARATOR"
                  },
                  "functionSelector": "3644e515",
                  "id": 397,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "DOMAIN_SEPARATOR",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 379,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6280:2:0"
                  },
                  "returnParameters": {
                    "id": 382,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 381,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 397,
                        "src": "6304:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 380,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "6304:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6303:9:0"
                  },
                  "scope": 418,
                  "src": "6255:262:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 416,
                    "nodeType": "Block",
                    "src": "6600:125:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 414,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 404,
                            "name": "digest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 402,
                            "src": "6610:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 408,
                                    "name": "EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 336,
                                    "src": "6646:40:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_string_memory_ptr",
                                      "typeString": "string memory"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 409,
                                      "name": "DOMAIN_SEPARATOR",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 397,
                                      "src": "6688:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                                        "typeString": "function () view returns (bytes32)"
                                      }
                                    },
                                    "id": 410,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "6688:18:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 411,
                                    "name": "dataHash",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 399,
                                    "src": "6708:8:0",
                                    "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": 406,
                                    "name": "abi",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -1,
                                    "src": "6629:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_abi",
                                      "typeString": "abi"
                                    }
                                  },
                                  "id": 407,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "memberName": "encodePacked",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "6629:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                    "typeString": "function () pure returns (bytes memory)"
                                  }
                                },
                                "id": 412,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6629:88:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "id": 405,
                              "name": "keccak256",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -8,
                              "src": "6619:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                "typeString": "function (bytes memory) pure returns (bytes32)"
                              }
                            },
                            "id": 413,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6619:99:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "6610:108:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 415,
                        "nodeType": "ExpressionStatement",
                        "src": "6610:108:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 417,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_getDigest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 400,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 399,
                        "mutability": "mutable",
                        "name": "dataHash",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 417,
                        "src": "6543:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 398,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "6543:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6542:18:0"
                  },
                  "returnParameters": {
                    "id": 403,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 402,
                        "mutability": "mutable",
                        "name": "digest",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 417,
                        "src": "6584:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 401,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "6584:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6583:16:0"
                  },
                  "scope": 418,
                  "src": "6523:202:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 4811,
              "src": "5074:1653:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 436,
              "linearizedBaseContracts": [
                436
              ],
              "name": "ERC20Data",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 419,
                    "nodeType": "StructuredDocumentation",
                    "src": "6999:36:0",
                    "text": "@notice owner > balance mapping."
                  },
                  "functionSelector": "70a08231",
                  "id": 423,
                  "mutability": "mutable",
                  "name": "balanceOf",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 436,
                  "src": "7040:44:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 422,
                    "keyType": {
                      "id": 420,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "7048:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "7040:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 421,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "7059:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 424,
                    "nodeType": "StructuredDocumentation",
                    "src": "7090:48:0",
                    "text": "@notice owner > spender > allowance mapping."
                  },
                  "functionSelector": "dd62ed3e",
                  "id": 430,
                  "mutability": "mutable",
                  "name": "allowance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 436,
                  "src": "7143:64:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                    "typeString": "mapping(address => mapping(address => uint256))"
                  },
                  "typeName": {
                    "id": 429,
                    "keyType": {
                      "id": 425,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "7151:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "7143:47:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                      "typeString": "mapping(address => mapping(address => uint256))"
                    },
                    "valueType": {
                      "id": 428,
                      "keyType": {
                        "id": 426,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "7170:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "7162:27:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      },
                      "valueType": {
                        "id": 427,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7181:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 431,
                    "nodeType": "StructuredDocumentation",
                    "src": "7213:52:0",
                    "text": "@notice owner > nonce mapping. Used in `permit`."
                  },
                  "functionSelector": "7ecebe00",
                  "id": 435,
                  "mutability": "mutable",
                  "name": "nonces",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 436,
                  "src": "7270:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 434,
                    "keyType": {
                      "id": 432,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "7278:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "7270:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 433,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "7289:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                }
              ],
              "scope": 4811,
              "src": "6974:340:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 437,
                    "name": "ERC20Data",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 436,
                    "src": "7334:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Data_$436",
                      "typeString": "contract ERC20Data"
                    }
                  },
                  "id": 438,
                  "nodeType": "InheritanceSpecifier",
                  "src": "7334:9:0"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 439,
                    "name": "Domain",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 418,
                    "src": "7345:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Domain_$418",
                      "typeString": "contract Domain"
                    }
                  },
                  "id": 440,
                  "nodeType": "InheritanceSpecifier",
                  "src": "7345:6:0"
                }
              ],
              "contractDependencies": [
                418,
                436
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 741,
              "linearizedBaseContracts": [
                741,
                418,
                436
              ],
              "name": "ERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 448,
                  "name": "Transfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 447,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 442,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "_from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 448,
                        "src": "7373:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 441,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7373:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 444,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "_to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 448,
                        "src": "7396:19:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 443,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7396:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 446,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 448,
                        "src": "7417:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 445,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7417:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7372:60:0"
                  },
                  "src": "7358:75:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 456,
                  "name": "Approval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 455,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 450,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "_owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 456,
                        "src": "7453:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 449,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7453:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 452,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "_spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 456,
                        "src": "7477:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 451,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7477:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 454,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 456,
                        "src": "7503:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 453,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7503:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7452:66:0"
                  },
                  "src": "7438:81:0"
                },
                {
                  "body": {
                    "id": 525,
                    "nodeType": "Block",
                    "src": "7807:669:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 468,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 466,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 461,
                            "src": "7890:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 467,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "7900:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "7890:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 515,
                        "nodeType": "IfStatement",
                        "src": "7886:516:0",
                        "trueBody": {
                          "id": 514,
                          "nodeType": "Block",
                          "src": "7903:499:0",
                          "statements": [
                            {
                              "assignments": [
                                470
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 470,
                                  "mutability": "mutable",
                                  "name": "srcBalance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 514,
                                  "src": "7917:18:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 469,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "7917:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 475,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 471,
                                  "name": "balanceOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 423,
                                  "src": "7938:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 474,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 472,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "7948:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 473,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "7948:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "7938:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "7917:42:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 479,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 477,
                                      "name": "srcBalance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 470,
                                      "src": "7981:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": ">=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 478,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 461,
                                      "src": "7995:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "7981:20:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "45524332303a2062616c616e636520746f6f206c6f77",
                                    "id": 480,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "8003:24:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_e327826c8eca47459171f95e7adc9af4769338677d977d36c069bc4dc2707645",
                                      "typeString": "literal_string \"ERC20: balance too low\""
                                    },
                                    "value": "ERC20: balance too low"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_e327826c8eca47459171f95e7adc9af4769338677d977d36c069bc4dc2707645",
                                      "typeString": "literal_string \"ERC20: balance too low\""
                                    }
                                  ],
                                  "id": 476,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "7973:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 481,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7973:55:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 482,
                              "nodeType": "ExpressionStatement",
                              "src": "7973:55:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 486,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 483,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "8046:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 484,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "8046:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 485,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 459,
                                  "src": "8060:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "8046:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 513,
                              "nodeType": "IfStatement",
                              "src": "8042:350:0",
                              "trueBody": {
                                "id": 512,
                                "nodeType": "Block",
                                "src": "8064:328:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          "id": 493,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 488,
                                            "name": "to",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 459,
                                            "src": "8090:2:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "!=",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "hexValue": "30",
                                                "id": 491,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "8104: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": 490,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "8096:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_address_$",
                                                "typeString": "type(address)"
                                              },
                                              "typeName": {
                                                "id": 489,
                                                "name": "address",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "8096:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            "id": 492,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "8096:10:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            }
                                          },
                                          "src": "8090:16:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "45524332303a206e6f207a65726f2061646472657373",
                                          "id": 494,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "string",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "8108:24:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_stringliteral_3adb72e007c4890ee721026a2f74db257566b13b80d954c8d30b87d4f922e5ce",
                                            "typeString": "literal_string \"ERC20: no zero address\""
                                          },
                                          "value": "ERC20: no zero address"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          {
                                            "typeIdentifier": "t_stringliteral_3adb72e007c4890ee721026a2f74db257566b13b80d954c8d30b87d4f922e5ce",
                                            "typeString": "literal_string \"ERC20: no zero address\""
                                          }
                                        ],
                                        "id": 487,
                                        "name": "require",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [
                                          -18,
                                          -18
                                        ],
                                        "referencedDeclaration": -18,
                                        "src": "8082:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                          "typeString": "function (bool,string memory) pure"
                                        }
                                      },
                                      "id": 495,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "8082:51:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 496,
                                    "nodeType": "ExpressionStatement",
                                    "src": "8082:51:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 504,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 497,
                                          "name": "balanceOf",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 423,
                                          "src": "8201:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                            "typeString": "mapping(address => uint256)"
                                          }
                                        },
                                        "id": 500,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 498,
                                            "name": "msg",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": -15,
                                            "src": "8211:3:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_magic_message",
                                              "typeString": "msg"
                                            }
                                          },
                                          "id": 499,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "sender",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": null,
                                          "src": "8211:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address_payable",
                                            "typeString": "address payable"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "8201:21:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 503,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 501,
                                          "name": "srcBalance",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 470,
                                          "src": "8225:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "-",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 502,
                                          "name": "amount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 461,
                                          "src": "8238:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "8225:19:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "8201:43:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 505,
                                    "nodeType": "ExpressionStatement",
                                    "src": "8201:43:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 510,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 506,
                                          "name": "balanceOf",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 423,
                                          "src": "8286:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                            "typeString": "mapping(address => uint256)"
                                          }
                                        },
                                        "id": 508,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 507,
                                          "name": "to",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 459,
                                          "src": "8296:2:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "8286:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "+=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 509,
                                        "name": "amount",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 461,
                                        "src": "8303:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "8286:23:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 511,
                                    "nodeType": "ExpressionStatement",
                                    "src": "8286:23:0"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 517,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "8425:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 518,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "8425:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 519,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 459,
                              "src": "8437:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 520,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 461,
                              "src": "8441:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 516,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 448,
                            "src": "8416:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 521,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8416:32:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 522,
                        "nodeType": "EmitStatement",
                        "src": "8411:37:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 523,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "8465:4:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 465,
                        "id": 524,
                        "nodeType": "Return",
                        "src": "8458:11:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 457,
                    "nodeType": "StructuredDocumentation",
                    "src": "7525:209:0",
                    "text": "@notice Transfers `amount` tokens from `msg.sender` to `to`.\n @param to The address to move the tokens.\n @param amount of the tokens to move.\n @return (bool) Returns True if succeeded."
                  },
                  "functionSelector": "a9059cbb",
                  "id": 526,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 462,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 459,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 526,
                        "src": "7757:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 458,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7757:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 461,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 526,
                        "src": "7769:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 460,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7769:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7756:28:0"
                  },
                  "returnParameters": {
                    "id": 465,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 464,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 526,
                        "src": "7801:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 463,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7801:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7800:6:0"
                  },
                  "scope": 741,
                  "src": "7739:737:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 629,
                    "nodeType": "Block",
                    "src": "8892:1078:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 540,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 538,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 533,
                            "src": "8969:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 539,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "8979:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "8969:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 620,
                        "nodeType": "IfStatement",
                        "src": "8965:937:0",
                        "trueBody": {
                          "id": 619,
                          "nodeType": "Block",
                          "src": "8982:920:0",
                          "statements": [
                            {
                              "assignments": [
                                542
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 542,
                                  "mutability": "mutable",
                                  "name": "srcBalance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 619,
                                  "src": "8996:18:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 541,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8996:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 546,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 543,
                                  "name": "balanceOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 423,
                                  "src": "9017:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 545,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 544,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 529,
                                  "src": "9027:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "9017:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "8996:36:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 550,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 548,
                                      "name": "srcBalance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 542,
                                      "src": "9054:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": ">=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 549,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 533,
                                      "src": "9068:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "9054:20:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "45524332303a2062616c616e636520746f6f206c6f77",
                                    "id": 551,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "9076:24:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_e327826c8eca47459171f95e7adc9af4769338677d977d36c069bc4dc2707645",
                                      "typeString": "literal_string \"ERC20: balance too low\""
                                    },
                                    "value": "ERC20: balance too low"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_e327826c8eca47459171f95e7adc9af4769338677d977d36c069bc4dc2707645",
                                      "typeString": "literal_string \"ERC20: balance too low\""
                                    }
                                  ],
                                  "id": 547,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "9046:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 552,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "9046:55:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 553,
                              "nodeType": "ExpressionStatement",
                              "src": "9046:55:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 556,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 554,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 529,
                                  "src": "9120:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 555,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 531,
                                  "src": "9128:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "9120:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 618,
                              "nodeType": "IfStatement",
                              "src": "9116:776:0",
                              "trueBody": {
                                "id": 617,
                                "nodeType": "Block",
                                "src": "9132:760:0",
                                "statements": [
                                  {
                                    "assignments": [
                                      558
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 558,
                                        "mutability": "mutable",
                                        "name": "spenderAllowance",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 617,
                                        "src": "9150:24:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 557,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "9150:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 565,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 559,
                                          "name": "allowance",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 430,
                                          "src": "9177:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                            "typeString": "mapping(address => mapping(address => uint256))"
                                          }
                                        },
                                        "id": 561,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 560,
                                          "name": "from",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 529,
                                          "src": "9187:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "9177:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                          "typeString": "mapping(address => uint256)"
                                        }
                                      },
                                      "id": 564,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 562,
                                          "name": "msg",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -15,
                                          "src": "9193:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_message",
                                            "typeString": "msg"
                                          }
                                        },
                                        "id": 563,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sender",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "9193:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "9177:27:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "9150:54:0"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 572,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 566,
                                        "name": "spenderAllowance",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 558,
                                        "src": "9326:16:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "!=",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 569,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "9351:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_uint256_$",
                                                "typeString": "type(uint256)"
                                              },
                                              "typeName": {
                                                "id": 568,
                                                "name": "uint256",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "9351:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_type$_t_uint256_$",
                                                "typeString": "type(uint256)"
                                              }
                                            ],
                                            "id": 567,
                                            "name": "type",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": -27,
                                            "src": "9346:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                              "typeString": "function () pure"
                                            }
                                          },
                                          "id": 570,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "9346:13:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_meta_type_t_uint256",
                                            "typeString": "type(uint256)"
                                          }
                                        },
                                        "id": 571,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "max",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "9346:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "9326:37:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": null,
                                    "id": 592,
                                    "nodeType": "IfStatement",
                                    "src": "9322:248:0",
                                    "trueBody": {
                                      "id": 591,
                                      "nodeType": "Block",
                                      "src": "9365:205:0",
                                      "statements": [
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "commonType": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                "id": 576,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                  "argumentTypes": null,
                                                  "id": 574,
                                                  "name": "spenderAllowance",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 558,
                                                  "src": "9395:16:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": ">=",
                                                "rightExpression": {
                                                  "argumentTypes": null,
                                                  "id": 575,
                                                  "name": "amount",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 533,
                                                  "src": "9415:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "src": "9395:26:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "hexValue": "45524332303a20616c6c6f77616e636520746f6f206c6f77",
                                                "id": 577,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "9423:26:0",
                                                "subdenomination": null,
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_stringliteral_84bef4fe58fa50e7896dbe599e2e3d0c2b8b9a0137970b3df150554a1dad01a9",
                                                  "typeString": "literal_string \"ERC20: allowance too low\""
                                                },
                                                "value": "ERC20: allowance too low"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                },
                                                {
                                                  "typeIdentifier": "t_stringliteral_84bef4fe58fa50e7896dbe599e2e3d0c2b8b9a0137970b3df150554a1dad01a9",
                                                  "typeString": "literal_string \"ERC20: allowance too low\""
                                                }
                                              ],
                                              "id": 573,
                                              "name": "require",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [
                                                -18,
                                                -18
                                              ],
                                              "referencedDeclaration": -18,
                                              "src": "9387:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,string memory) pure"
                                              }
                                            },
                                            "id": 578,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "9387:63:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_tuple$__$",
                                              "typeString": "tuple()"
                                            }
                                          },
                                          "id": 579,
                                          "nodeType": "ExpressionStatement",
                                          "src": "9387:63:0"
                                        },
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 589,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftHandSide": {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "baseExpression": {
                                                  "argumentTypes": null,
                                                  "id": 580,
                                                  "name": "allowance",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 430,
                                                  "src": "9472:9:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                                    "typeString": "mapping(address => mapping(address => uint256))"
                                                  }
                                                },
                                                "id": 584,
                                                "indexExpression": {
                                                  "argumentTypes": null,
                                                  "id": 581,
                                                  "name": "from",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 529,
                                                  "src": "9482:4:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  }
                                                },
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "IndexAccess",
                                                "src": "9472:15:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                                  "typeString": "mapping(address => uint256)"
                                                }
                                              },
                                              "id": 585,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 582,
                                                  "name": "msg",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": -15,
                                                  "src": "9488:3:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_magic_message",
                                                    "typeString": "msg"
                                                  }
                                                },
                                                "id": 583,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "sender",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": null,
                                                "src": "9488:10:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address_payable",
                                                  "typeString": "address payable"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": true,
                                              "nodeType": "IndexAccess",
                                              "src": "9472:27:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "Assignment",
                                            "operator": "=",
                                            "rightHandSide": {
                                              "argumentTypes": null,
                                              "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              "id": 588,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "leftExpression": {
                                                "argumentTypes": null,
                                                "id": 586,
                                                "name": "spenderAllowance",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 558,
                                                "src": "9502:16:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "nodeType": "BinaryOperation",
                                              "operator": "-",
                                              "rightExpression": {
                                                "argumentTypes": null,
                                                "id": 587,
                                                "name": "amount",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 533,
                                                "src": "9521:6:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "src": "9502:25:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "9472:55:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 590,
                                          "nodeType": "ExpressionStatement",
                                          "src": "9472:55:0"
                                        }
                                      ]
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          "id": 599,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 594,
                                            "name": "to",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 531,
                                            "src": "9595:2:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "!=",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "hexValue": "30",
                                                "id": 597,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "9609: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": 596,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "9601:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_address_$",
                                                "typeString": "type(address)"
                                              },
                                              "typeName": {
                                                "id": 595,
                                                "name": "address",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "9601:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            "id": 598,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "9601:10:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            }
                                          },
                                          "src": "9595:16:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "45524332303a206e6f207a65726f2061646472657373",
                                          "id": 600,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "string",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "9613:24:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_stringliteral_3adb72e007c4890ee721026a2f74db257566b13b80d954c8d30b87d4f922e5ce",
                                            "typeString": "literal_string \"ERC20: no zero address\""
                                          },
                                          "value": "ERC20: no zero address"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          {
                                            "typeIdentifier": "t_stringliteral_3adb72e007c4890ee721026a2f74db257566b13b80d954c8d30b87d4f922e5ce",
                                            "typeString": "literal_string \"ERC20: no zero address\""
                                          }
                                        ],
                                        "id": 593,
                                        "name": "require",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [
                                          -18,
                                          -18
                                        ],
                                        "referencedDeclaration": -18,
                                        "src": "9587:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                          "typeString": "function (bool,string memory) pure"
                                        }
                                      },
                                      "id": 601,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "9587:51:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 602,
                                    "nodeType": "ExpressionStatement",
                                    "src": "9587:51:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 609,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 603,
                                          "name": "balanceOf",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 423,
                                          "src": "9707:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                            "typeString": "mapping(address => uint256)"
                                          }
                                        },
                                        "id": 605,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 604,
                                          "name": "from",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 529,
                                          "src": "9717:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "9707:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 608,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 606,
                                          "name": "srcBalance",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 542,
                                          "src": "9725:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "-",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 607,
                                          "name": "amount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 533,
                                          "src": "9738:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "9725:19:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "9707:37:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 610,
                                    "nodeType": "ExpressionStatement",
                                    "src": "9707:37:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 615,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 611,
                                          "name": "balanceOf",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 423,
                                          "src": "9786:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                            "typeString": "mapping(address => uint256)"
                                          }
                                        },
                                        "id": 613,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 612,
                                          "name": "to",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 531,
                                          "src": "9796:2:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "9786:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "+=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 614,
                                        "name": "amount",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 533,
                                        "src": "9803:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "9786:23:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 616,
                                    "nodeType": "ExpressionStatement",
                                    "src": "9786:23:0"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 622,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 529,
                              "src": "9925:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 623,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 531,
                              "src": "9931:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 624,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 533,
                              "src": "9935:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 621,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 448,
                            "src": "9916:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 625,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9916:26:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 626,
                        "nodeType": "EmitStatement",
                        "src": "9911:31:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 627,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "9959:4:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 537,
                        "id": 628,
                        "nodeType": "Return",
                        "src": "9952:11:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 527,
                    "nodeType": "StructuredDocumentation",
                    "src": "8482:289:0",
                    "text": "@notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.\n @param from Address to draw tokens from.\n @param to The address to move the tokens.\n @param amount The token amount to move.\n @return (bool) Returns True if succeeded."
                  },
                  "functionSelector": "23b872dd",
                  "id": 630,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 534,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 529,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 630,
                        "src": "8807:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 528,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8807:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 531,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 630,
                        "src": "8829:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 530,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8829:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 533,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 630,
                        "src": "8849:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 532,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8849:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8797:72:0"
                  },
                  "returnParameters": {
                    "id": 537,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 536,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 630,
                        "src": "8886:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 535,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8886:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8885:6:0"
                  },
                  "scope": 741,
                  "src": "8776:1194:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 658,
                    "nodeType": "Block",
                    "src": "10331:129:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 647,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 640,
                                "name": "allowance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 430,
                                "src": "10341:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(address => mapping(address => uint256))"
                                }
                              },
                              "id": 644,
                              "indexExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 641,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "10351:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 642,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "10351:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "10341:21:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 645,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 643,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 633,
                              "src": "10363:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "10341:30:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 646,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 635,
                            "src": "10374:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10341:39:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 648,
                        "nodeType": "ExpressionStatement",
                        "src": "10341:39:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 650,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "10404:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 651,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "10404:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 652,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 633,
                              "src": "10416:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 653,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 635,
                              "src": "10425:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 649,
                            "name": "Approval",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 456,
                            "src": "10395:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 654,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10395:37:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 655,
                        "nodeType": "EmitStatement",
                        "src": "10390:42:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 656,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "10449:4:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 639,
                        "id": 657,
                        "nodeType": "Return",
                        "src": "10442:11:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 631,
                    "nodeType": "StructuredDocumentation",
                    "src": "9976:278:0",
                    "text": "@notice Approves `amount` from sender to be spend by `spender`.\n @param spender Address of the party that can draw from msg.sender's account.\n @param amount The maximum collective amount that `spender` can draw.\n @return (bool) Returns True if approved."
                  },
                  "functionSelector": "095ea7b3",
                  "id": 659,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 636,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 633,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 659,
                        "src": "10276:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 632,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10276:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 635,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 659,
                        "src": "10293:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 634,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10293:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10275:33:0"
                  },
                  "returnParameters": {
                    "id": 639,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 638,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 659,
                        "src": "10325:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 637,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10325:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10324:6:0"
                  },
                  "scope": 741,
                  "src": "10259:201:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "id": 662,
                  "mutability": "constant",
                  "name": "PERMIT_SIGNATURE_HASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 741,
                  "src": "10570:115:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 660,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "10570:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "307836653731656461653132623162393766346431663630333730666566313031303566613266616165303132363131346131363963363438343564363132366339",
                    "id": 661,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "10619:66:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_49955707469362902507454157297736832118868343942642399513960811609542965143241_by_1",
                      "typeString": "int_const 4995...(69 digits omitted)...3241"
                    },
                    "value": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9"
                  },
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 739,
                    "nodeType": "Block",
                    "src": "11263:463:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 686,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 681,
                                "name": "owner_",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 665,
                                "src": "11281:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 684,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "11299: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": 683,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "11291:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 682,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "11291:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 685,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11291:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "11281:20:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a204f776e65722063616e6e6f742062652030",
                              "id": 687,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "11303:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d227bf0f09891e8f9d52e82638c5d3adc1c7a648bf155567088e9f930a17863a",
                                "typeString": "literal_string \"ERC20: Owner cannot be 0\""
                              },
                              "value": "ERC20: Owner cannot be 0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d227bf0f09891e8f9d52e82638c5d3adc1c7a648bf155567088e9f930a17863a",
                                "typeString": "literal_string \"ERC20: Owner cannot be 0\""
                              }
                            ],
                            "id": 680,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "11273:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 688,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11273:57:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 689,
                        "nodeType": "ExpressionStatement",
                        "src": "11273:57:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 694,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 691,
                                  "name": "block",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -4,
                                  "src": "11348:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_block",
                                    "typeString": "block"
                                  }
                                },
                                "id": 692,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "timestamp",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "11348:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 693,
                                "name": "deadline",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 671,
                                "src": "11366:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "11348:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a2045787069726564",
                              "id": 695,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "11376:16:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8de0f645c4c75b46fe87a70837d5917699eefc83d9e53d54aa5950eec20d9a99",
                                "typeString": "literal_string \"ERC20: Expired\""
                              },
                              "value": "ERC20: Expired"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8de0f645c4c75b46fe87a70837d5917699eefc83d9e53d54aa5950eec20d9a99",
                                "typeString": "literal_string \"ERC20: Expired\""
                              }
                            ],
                            "id": 690,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "11340:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 696,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11340:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 697,
                        "nodeType": "ExpressionStatement",
                        "src": "11340:53:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 721,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 704,
                                                "name": "PERMIT_SIGNATURE_HASH",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 662,
                                                "src": "11466:21:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 705,
                                                "name": "owner_",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 665,
                                                "src": "11489:6:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 706,
                                                "name": "spender",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 667,
                                                "src": "11497:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 707,
                                                "name": "value",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 669,
                                                "src": "11506:5:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 711,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "UnaryOperation",
                                                "operator": "++",
                                                "prefix": false,
                                                "src": "11513:16:0",
                                                "subExpression": {
                                                  "argumentTypes": null,
                                                  "baseExpression": {
                                                    "argumentTypes": null,
                                                    "id": 708,
                                                    "name": "nonces",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 435,
                                                    "src": "11513:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                                      "typeString": "mapping(address => uint256)"
                                                    }
                                                  },
                                                  "id": 710,
                                                  "indexExpression": {
                                                    "argumentTypes": null,
                                                    "id": 709,
                                                    "name": "owner_",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 665,
                                                    "src": "11520:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_address",
                                                      "typeString": "address"
                                                    }
                                                  },
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": true,
                                                  "nodeType": "IndexAccess",
                                                  "src": "11513:14:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 712,
                                                "name": "deadline",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 671,
                                                "src": "11531:8:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_bytes32",
                                                  "typeString": "bytes32"
                                                },
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                },
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                },
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 702,
                                                "name": "abi",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": -1,
                                                "src": "11455:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_magic_abi",
                                                  "typeString": "abi"
                                                }
                                              },
                                              "id": 703,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "memberName": "encode",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": null,
                                              "src": "11455:10:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                                "typeString": "function () pure returns (bytes memory)"
                                              }
                                            },
                                            "id": 713,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "11455:85:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            }
                                          ],
                                          "id": 701,
                                          "name": "keccak256",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -8,
                                          "src": "11445:9:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                            "typeString": "function (bytes memory) pure returns (bytes32)"
                                          }
                                        },
                                        "id": 714,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "11445:96:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      ],
                                      "id": 700,
                                      "name": "_getDigest",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 417,
                                      "src": "11434:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$",
                                        "typeString": "function (bytes32) view returns (bytes32)"
                                      }
                                    },
                                    "id": 715,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "11434:108:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 716,
                                    "name": "v",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 673,
                                    "src": "11544:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 717,
                                    "name": "r",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 675,
                                    "src": "11547:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 718,
                                    "name": "s",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 677,
                                    "src": "11550: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": 699,
                                  "name": "ecrecover",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -6,
                                  "src": "11424: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": 719,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11424:128:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 720,
                                "name": "owner_",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 665,
                                "src": "11572:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "11424:154:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a20496e76616c6964205369676e6174757265",
                              "id": 722,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "11592:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_feb3dbf96cfb7641ce579ad49b78afe793a6caf89893783c03a588ed7340adfe",
                                "typeString": "literal_string \"ERC20: Invalid Signature\""
                              },
                              "value": "ERC20: Invalid Signature"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_feb3dbf96cfb7641ce579ad49b78afe793a6caf89893783c03a588ed7340adfe",
                                "typeString": "literal_string \"ERC20: Invalid Signature\""
                              }
                            ],
                            "id": 698,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "11403:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 723,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11403:225:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 724,
                        "nodeType": "ExpressionStatement",
                        "src": "11403:225:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 731,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 725,
                                "name": "allowance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 430,
                                "src": "11638:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(address => mapping(address => uint256))"
                                }
                              },
                              "id": 728,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 726,
                                "name": "owner_",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 665,
                                "src": "11648:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "11638:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 729,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 727,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 667,
                              "src": "11656:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "11638:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 730,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 669,
                            "src": "11667:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "11638:34:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 732,
                        "nodeType": "ExpressionStatement",
                        "src": "11638:34:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 734,
                              "name": "owner_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 665,
                              "src": "11696:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 735,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 667,
                              "src": "11704:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 736,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 669,
                              "src": "11713:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 733,
                            "name": "Approval",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 456,
                            "src": "11687:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 737,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11687:32:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 738,
                        "nodeType": "EmitStatement",
                        "src": "11682:37:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 663,
                    "nodeType": "StructuredDocumentation",
                    "src": "10692:382:0",
                    "text": "@notice Approves `value` from `owner_` to be spend by `spender`.\n @param owner_ Address of the owner.\n @param spender The address of the spender that gets approved to draw from `owner_`.\n @param value The maximum collective amount that `spender` can draw.\n @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds)."
                  },
                  "functionSelector": "d505accf",
                  "id": 740,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 678,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 665,
                        "mutability": "mutable",
                        "name": "owner_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 740,
                        "src": "11104:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 664,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11104:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 667,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 740,
                        "src": "11128:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 666,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11128:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 669,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 740,
                        "src": "11153:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 668,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11153:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 671,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 740,
                        "src": "11176:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 670,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11176:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 673,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 740,
                        "src": "11202:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 672,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "11202:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 675,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 740,
                        "src": "11219:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 674,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "11219:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 677,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 740,
                        "src": "11238:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 676,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "11238:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11094:159:0"
                  },
                  "returnParameters": {
                    "id": 679,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11263:0:0"
                  },
                  "scope": 741,
                  "src": "11079:647:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "7316:4412:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 748,
              "linearizedBaseContracts": [
                748
              ],
              "name": "IMasterContract",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 742,
                    "nodeType": "StructuredDocumentation",
                    "src": "11876: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": 747,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 745,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 744,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 747,
                        "src": "12153:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 743,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "12153:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12152:21:0"
                  },
                  "returnParameters": {
                    "id": 746,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12190:0:0"
                  },
                  "scope": 748,
                  "src": "12139:52:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "11844:349:0"
            },
            {
              "canonicalName": "Rebase",
              "id": 753,
              "members": [
                {
                  "constant": false,
                  "id": 750,
                  "mutability": "mutable",
                  "name": "elastic",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 753,
                  "src": "12325:15:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 749,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "12325:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 752,
                  "mutability": "mutable",
                  "name": "base",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 753,
                  "src": "12346:12:0",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint128",
                    "typeString": "uint128"
                  },
                  "typeName": {
                    "id": 751,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "12346:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "name": "Rebase",
              "nodeType": "StructDefinition",
              "scope": 4811,
              "src": "12305:56:0",
              "visibility": "public"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 754,
                "nodeType": "StructuredDocumentation",
                "src": "12363:68:0",
                "text": "@notice A rebasing library using overflow-/underflow-safe math."
              },
              "fullyImplemented": true,
              "id": 1053,
              "linearizedBaseContracts": [
                1053
              ],
              "name": "RebaseLibrary",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 757,
                  "libraryName": {
                    "contractScope": null,
                    "id": 755,
                    "name": "BoringMath",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 154,
                    "src": "12465:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath_$154",
                      "typeString": "library BoringMath"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "12459:29:0",
                  "typeName": {
                    "id": 756,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12480:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 760,
                  "libraryName": {
                    "contractScope": null,
                    "id": 758,
                    "name": "BoringMath128",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 200,
                    "src": "12499:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath128_$200",
                      "typeString": "library BoringMath128"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "12493:32:0",
                  "typeName": {
                    "id": 759,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "12517:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  }
                },
                {
                  "body": {
                    "id": 815,
                    "nodeType": "Block",
                    "src": "12750:283:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 775,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 772,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 763,
                              "src": "12764:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 773,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "12764:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 774,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "12781:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "12764:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 813,
                          "nodeType": "Block",
                          "src": "12829:198:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 790,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 781,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 770,
                                  "src": "12843:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 789,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 784,
                                          "name": "total",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 763,
                                          "src": "12862:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                            "typeString": "struct Rebase memory"
                                          }
                                        },
                                        "id": 785,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "base",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 752,
                                        "src": "12862:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 782,
                                        "name": "elastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 765,
                                        "src": "12850:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 783,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 75,
                                      "src": "12850: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": 786,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "12850:23:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 787,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 763,
                                      "src": "12876:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 788,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "elastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 750,
                                    "src": "12876:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "12850:39:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "12843:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 791,
                              "nodeType": "ExpressionStatement",
                              "src": "12843:46:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 803,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 792,
                                  "name": "roundUp",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 767,
                                  "src": "12907:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "&&",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 802,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 800,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 795,
                                            "name": "total",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 763,
                                            "src": "12927:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                              "typeString": "struct Rebase memory"
                                            }
                                          },
                                          "id": 796,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "elastic",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 750,
                                          "src": "12927:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 793,
                                          "name": "base",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 770,
                                          "src": "12918:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 794,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "mul",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 75,
                                        "src": "12918: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": 797,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "12918:23:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "/",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 798,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 763,
                                        "src": "12944:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 799,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "base",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 752,
                                      "src": "12944:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "12918:36:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "<",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 801,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 765,
                                    "src": "12957:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "12918:46:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "12907:57:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 812,
                              "nodeType": "IfStatement",
                              "src": "12903:114:0",
                              "trueBody": {
                                "id": 811,
                                "nodeType": "Block",
                                "src": "12966:51:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 809,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 804,
                                        "name": "base",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 770,
                                        "src": "12984:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "31",
                                            "id": 807,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "13000: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": 805,
                                            "name": "base",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 770,
                                            "src": "12991:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 806,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25,
                                          "src": "12991: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": 808,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "12991:11:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "12984:18:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 810,
                                    "nodeType": "ExpressionStatement",
                                    "src": "12984:18:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 814,
                        "nodeType": "IfStatement",
                        "src": "12760:267:0",
                        "trueBody": {
                          "id": 780,
                          "nodeType": "Block",
                          "src": "12784:39:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 778,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 776,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 770,
                                  "src": "12798:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 777,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 765,
                                  "src": "12805:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "12798:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 779,
                              "nodeType": "ExpressionStatement",
                              "src": "12798:14:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 761,
                    "nodeType": "StructuredDocumentation",
                    "src": "12531:79:0",
                    "text": "@notice Calculates the base value in relationship to `elastic` and `total`."
                  },
                  "id": 816,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toBase",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 768,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 763,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 816,
                        "src": "12640:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 762,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "12640:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 765,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 816,
                        "src": "12669:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 764,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12669:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 767,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 816,
                        "src": "12694:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 766,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "12694:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12630:82:0"
                  },
                  "returnParameters": {
                    "id": 771,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 770,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 816,
                        "src": "12736:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 769,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12736:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12735:14:0"
                  },
                  "scope": 1053,
                  "src": "12615:418:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 871,
                    "nodeType": "Block",
                    "src": "13261:286:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 831,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 828,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 819,
                              "src": "13275:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 829,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "13275:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 830,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "13289:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "13275:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 869,
                          "nodeType": "Block",
                          "src": "13337:204:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 846,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 837,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 826,
                                  "src": "13351:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 845,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 840,
                                          "name": "total",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 819,
                                          "src": "13370:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                            "typeString": "struct Rebase memory"
                                          }
                                        },
                                        "id": 841,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "elastic",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 750,
                                        "src": "13370:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 838,
                                        "name": "base",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 821,
                                        "src": "13361:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 839,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 75,
                                      "src": "13361: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": 842,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "13361:23:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 843,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 819,
                                      "src": "13387:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 844,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "base",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 752,
                                    "src": "13387:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  },
                                  "src": "13361:36:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "13351:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 847,
                              "nodeType": "ExpressionStatement",
                              "src": "13351:46:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 859,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 848,
                                  "name": "roundUp",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 823,
                                  "src": "13415:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "&&",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 858,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 856,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 851,
                                            "name": "total",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 819,
                                            "src": "13438:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                              "typeString": "struct Rebase memory"
                                            }
                                          },
                                          "id": 852,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "base",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 752,
                                          "src": "13438:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 849,
                                          "name": "elastic",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 826,
                                          "src": "13426:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 850,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "mul",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 75,
                                        "src": "13426: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": 853,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "13426:23:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "/",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 854,
                                        "name": "total",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 819,
                                        "src": "13452:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 855,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "elastic",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 750,
                                      "src": "13452:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "src": "13426:39:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "<",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 857,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 821,
                                    "src": "13468:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "13426:46:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "13415:57:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 868,
                              "nodeType": "IfStatement",
                              "src": "13411:120:0",
                              "trueBody": {
                                "id": 867,
                                "nodeType": "Block",
                                "src": "13474:57:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 865,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 860,
                                        "name": "elastic",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 826,
                                        "src": "13492:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "31",
                                            "id": 863,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "13514: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": 861,
                                            "name": "elastic",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 826,
                                            "src": "13502:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 862,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25,
                                          "src": "13502: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": 864,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "13502:14:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "13492:24:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 866,
                                    "nodeType": "ExpressionStatement",
                                    "src": "13492:24:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 870,
                        "nodeType": "IfStatement",
                        "src": "13271:270:0",
                        "trueBody": {
                          "id": 836,
                          "nodeType": "Block",
                          "src": "13292:39:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 834,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 832,
                                  "name": "elastic",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 826,
                                  "src": "13306:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 833,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 821,
                                  "src": "13316:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "13306:14:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 835,
                              "nodeType": "ExpressionStatement",
                              "src": "13306:14:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 817,
                    "nodeType": "StructuredDocumentation",
                    "src": "13039:79:0",
                    "text": "@notice Calculates the elastic value in relationship to `base` and `total`."
                  },
                  "id": 872,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toElastic",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 824,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 819,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 872,
                        "src": "13151:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 818,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "13151:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 821,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 872,
                        "src": "13180:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 820,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13180:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 823,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 872,
                        "src": "13202:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 822,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13202:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13141:79:0"
                  },
                  "returnParameters": {
                    "id": 827,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 826,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 872,
                        "src": "13244:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 825,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13244:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13243:17:0"
                  },
                  "scope": 1053,
                  "src": "13123:424:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 922,
                    "nodeType": "Block",
                    "src": "13858:196:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 892,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 886,
                            "name": "base",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 884,
                            "src": "13868:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 888,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 875,
                                "src": "13882:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 889,
                                "name": "elastic",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 877,
                                "src": "13889:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 890,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 879,
                                "src": "13898:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "id": 887,
                              "name": "toBase",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 816,
                              "src": "13875:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 891,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13875:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "13868:38:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 893,
                        "nodeType": "ExpressionStatement",
                        "src": "13868:38:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 904,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 894,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 875,
                              "src": "13916:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 896,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "13916:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 900,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 877,
                                    "src": "13950:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 901,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "13950:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 902,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "13950:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 897,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 875,
                                  "src": "13932:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 898,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "13932:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 899,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "13932: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": 903,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13932:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "13916:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 905,
                        "nodeType": "ExpressionStatement",
                        "src": "13916:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 916,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 906,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 875,
                              "src": "13976:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 908,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "13976:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 912,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 884,
                                    "src": "14004:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 913,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "14004:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 914,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14004:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 909,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 875,
                                  "src": "13989:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 910,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "13989:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 911,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "13989: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": 915,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13989:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "13976:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 917,
                        "nodeType": "ExpressionStatement",
                        "src": "13976:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 918,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 875,
                              "src": "14035:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 919,
                              "name": "base",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 884,
                              "src": "14042:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 920,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "14034:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$",
                            "typeString": "tuple(struct Rebase memory,uint256)"
                          }
                        },
                        "functionReturnParameters": 885,
                        "id": 921,
                        "nodeType": "Return",
                        "src": "14027:20:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 873,
                    "nodeType": "StructuredDocumentation",
                    "src": "13553: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": 923,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 880,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 875,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 923,
                        "src": "13733:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 874,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "13733:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 877,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 923,
                        "src": "13762:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 876,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13762:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 879,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 923,
                        "src": "13787:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 878,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13787:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13723:82:0"
                  },
                  "returnParameters": {
                    "id": 885,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 882,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 923,
                        "src": "13829:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 881,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "13829:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 884,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 923,
                        "src": "13844:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 883,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13844:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13828:29:0"
                  },
                  "scope": 1053,
                  "src": "13711:343:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 973,
                    "nodeType": "Block",
                    "src": "14366:202:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 943,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 937,
                            "name": "elastic",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 935,
                            "src": "14376:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 939,
                                "name": "total",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 926,
                                "src": "14396:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 940,
                                "name": "base",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 928,
                                "src": "14403:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 941,
                                "name": "roundUp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 930,
                                "src": "14409:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "id": 938,
                              "name": "toElastic",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 872,
                              "src": "14386:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                              }
                            },
                            "id": 942,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14386:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "14376:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 944,
                        "nodeType": "ExpressionStatement",
                        "src": "14376:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 955,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 945,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 926,
                              "src": "14427:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 947,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "14427:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 951,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 935,
                                    "src": "14461:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 952,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "14461:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 953,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14461:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 948,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 926,
                                  "src": "14443:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 949,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "14443:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 950,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "14443: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": 954,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14443:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "14427:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 956,
                        "nodeType": "ExpressionStatement",
                        "src": "14427:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 967,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 957,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 926,
                              "src": "14487:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 959,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "14487:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 963,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 928,
                                    "src": "14515:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 964,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "14515:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 965,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14515:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 960,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 926,
                                  "src": "14500:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 961,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "14500:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 962,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "14500: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": 966,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14500:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "14487:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 968,
                        "nodeType": "ExpressionStatement",
                        "src": "14487:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 969,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 926,
                              "src": "14546:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 970,
                              "name": "elastic",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 935,
                              "src": "14553:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 971,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "14545:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$",
                            "typeString": "tuple(struct Rebase memory,uint256)"
                          }
                        },
                        "functionReturnParameters": 936,
                        "id": 972,
                        "nodeType": "Return",
                        "src": "14538:23:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 924,
                    "nodeType": "StructuredDocumentation",
                    "src": "14060: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": 974,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 931,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 926,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 974,
                        "src": "14241:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 925,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "14241:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 928,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 974,
                        "src": "14270:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 927,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14270:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 930,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 974,
                        "src": "14292:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 929,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14292:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14231:79:0"
                  },
                  "returnParameters": {
                    "id": 936,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 933,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 974,
                        "src": "14334:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 932,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "14334:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 935,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 974,
                        "src": "14349:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 934,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14349:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14333:32:0"
                  },
                  "scope": 1053,
                  "src": "14219:349:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1012,
                    "nodeType": "Block",
                    "src": "14760:140:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 996,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 986,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 977,
                              "src": "14770:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 988,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "14770:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 992,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 979,
                                    "src": "14804:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 993,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "14804:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 994,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14804:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 989,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 977,
                                  "src": "14786:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 990,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "14786:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 991,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "14786: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": 995,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14786:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "14770:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 997,
                        "nodeType": "ExpressionStatement",
                        "src": "14770:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1008,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 998,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 977,
                              "src": "14830:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 1000,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "14830:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1004,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 981,
                                    "src": "14858:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 1005,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "14858:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 1006,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14858:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1001,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 977,
                                  "src": "14843:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 1002,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "14843:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 1003,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "14843: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": 1007,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14843:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "14830:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 1009,
                        "nodeType": "ExpressionStatement",
                        "src": "14830:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1010,
                          "name": "total",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 977,
                          "src": "14888:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                            "typeString": "struct Rebase memory"
                          }
                        },
                        "functionReturnParameters": 985,
                        "id": 1011,
                        "nodeType": "Return",
                        "src": "14881:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 975,
                    "nodeType": "StructuredDocumentation",
                    "src": "14574:48:0",
                    "text": "@notice Add `elastic` and `base` to `total`."
                  },
                  "id": 1013,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 982,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 977,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1013,
                        "src": "14649:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 976,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "14649:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 979,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1013,
                        "src": "14678:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 978,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14678:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 981,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1013,
                        "src": "14703:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 980,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14703:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14639:82:0"
                  },
                  "returnParameters": {
                    "id": 985,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 984,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1013,
                        "src": "14745:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 983,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "14745:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14744:15:0"
                  },
                  "scope": 1053,
                  "src": "14627:273:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1051,
                    "nodeType": "Block",
                    "src": "15097:140:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1035,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1025,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1016,
                              "src": "15107:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 1027,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "15107:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1031,
                                    "name": "elastic",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1018,
                                    "src": "15141:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 1032,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "15141:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 1033,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "15141:15:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1028,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1016,
                                  "src": "15123:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 1029,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "15123:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 1030,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "15123: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": 1034,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15123:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "15107:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 1036,
                        "nodeType": "ExpressionStatement",
                        "src": "15107:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1047,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1037,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1016,
                              "src": "15167:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 1039,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "15167:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1043,
                                    "name": "base",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1020,
                                    "src": "15195:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 1044,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "15195:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 1045,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "15195:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1040,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1016,
                                  "src": "15180:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 1041,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "15180:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 1042,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "15180: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": 1046,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15180:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "15167:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 1048,
                        "nodeType": "ExpressionStatement",
                        "src": "15167:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1049,
                          "name": "total",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1016,
                          "src": "15225:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                            "typeString": "struct Rebase memory"
                          }
                        },
                        "functionReturnParameters": 1024,
                        "id": 1050,
                        "nodeType": "Return",
                        "src": "15218:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1014,
                    "nodeType": "StructuredDocumentation",
                    "src": "14906:53:0",
                    "text": "@notice Subtract `elastic` and `base` to `total`."
                  },
                  "id": 1052,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1021,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1016,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1052,
                        "src": "14986:19:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1015,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "14986:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1018,
                        "mutability": "mutable",
                        "name": "elastic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1052,
                        "src": "15015:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1017,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15015:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1020,
                        "mutability": "mutable",
                        "name": "base",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1052,
                        "src": "15040:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1019,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15040:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14976:82:0"
                  },
                  "returnParameters": {
                    "id": 1024,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1023,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1052,
                        "src": "15082:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1022,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "15082:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15081:15:0"
                  },
                  "scope": 1053,
                  "src": "14964:273:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 4811,
              "src": "12431:2808:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1118,
              "linearizedBaseContracts": [
                1118
              ],
              "name": "IERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "18160ddd",
                  "id": 1058,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1054,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15389:2:0"
                  },
                  "returnParameters": {
                    "id": 1057,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1056,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1058,
                        "src": "15415:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1055,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15415:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15414:9:0"
                  },
                  "scope": 1118,
                  "src": "15369:55:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "70a08231",
                  "id": 1065,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1061,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1060,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1065,
                        "src": "15449:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1059,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15449:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15448:17:0"
                  },
                  "returnParameters": {
                    "id": 1064,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1063,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1065,
                        "src": "15489:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1062,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15489:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15488:9:0"
                  },
                  "scope": 1118,
                  "src": "15430:68:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "dd62ed3e",
                  "id": 1074,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "allowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1070,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1067,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1074,
                        "src": "15523:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1066,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15523:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1069,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1074,
                        "src": "15538:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1068,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15538:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15522:32:0"
                  },
                  "returnParameters": {
                    "id": 1073,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1072,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1074,
                        "src": "15578:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1071,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15578:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15577:9:0"
                  },
                  "scope": 1118,
                  "src": "15504:83:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "095ea7b3",
                  "id": 1083,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1079,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1076,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1083,
                        "src": "15610:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1075,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15610:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1078,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1083,
                        "src": "15627:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1077,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15627:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15609:33:0"
                  },
                  "returnParameters": {
                    "id": 1082,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1081,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1083,
                        "src": "15661:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1080,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "15661:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15660:6:0"
                  },
                  "scope": 1118,
                  "src": "15593:74:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1091,
                  "name": "Transfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1090,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1085,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1091,
                        "src": "15688:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1084,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15688:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1087,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1091,
                        "src": "15710:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1086,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15710:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1089,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1091,
                        "src": "15730:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1088,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15730:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15687:57:0"
                  },
                  "src": "15673:72:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1099,
                  "name": "Approval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1098,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1093,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1099,
                        "src": "15765:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1092,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15765:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1095,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1099,
                        "src": "15788:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1094,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15788:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1097,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1099,
                        "src": "15813:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1096,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15813:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15764:63:0"
                  },
                  "src": "15750:78:0"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1100,
                    "nodeType": "StructuredDocumentation",
                    "src": "15834:20:0",
                    "text": "@notice EIP 2612"
                  },
                  "functionSelector": "d505accf",
                  "id": 1117,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1115,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1102,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1117,
                        "src": "15884:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1101,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15884:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1104,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1117,
                        "src": "15907:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1103,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15907:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1106,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1117,
                        "src": "15932:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1105,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15932:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1108,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1117,
                        "src": "15955:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1107,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15955:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1110,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1117,
                        "src": "15981:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1109,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "15981:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1112,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1117,
                        "src": "15998:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1111,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "15998:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1114,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1117,
                        "src": "16017:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1113,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "16017:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15874:158:0"
                  },
                  "returnParameters": {
                    "id": 1116,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16041:0:0"
                  },
                  "scope": 1118,
                  "src": "15859:183:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "15346:698:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 1323,
              "linearizedBaseContracts": [
                1323
              ],
              "name": "BoringERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "id": 1121,
                  "mutability": "constant",
                  "name": "SIG_SYMBOL",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1323,
                  "src": "16181:47:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 1119,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "16181:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783935643839623431",
                    "id": 1120,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "16218:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2514000705_by_1",
                      "typeString": "int_const 2514000705"
                    },
                    "value": "0x95d89b41"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1124,
                  "mutability": "constant",
                  "name": "SIG_NAME",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1323,
                  "src": "16246:45:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 1122,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "16246:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783036666464653033",
                    "id": 1123,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "16281:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_117300739_by_1",
                      "typeString": "int_const 117300739"
                    },
                    "value": "0x06fdde03"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1127,
                  "mutability": "constant",
                  "name": "SIG_DECIMALS",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1323,
                  "src": "16307:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 1125,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "16307:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783331336365353637",
                    "id": 1126,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "16346:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_826074471_by_1",
                      "typeString": "int_const 826074471"
                    },
                    "value": "0x313ce567"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1130,
                  "mutability": "constant",
                  "name": "SIG_TRANSFER",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1323,
                  "src": "16376:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 1128,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "16376:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30786139303539636262",
                    "id": 1129,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "16415:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2835717307_by_1",
                      "typeString": "int_const 2835717307"
                    },
                    "value": "0xa9059cbb"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 1133,
                  "mutability": "constant",
                  "name": "SIG_TRANSFER_FROM",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1323,
                  "src": "16460:54:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 1131,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "16460:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783233623837326464",
                    "id": 1132,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "16504:10:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_599290589_by_1",
                      "typeString": "int_const 599290589"
                    },
                    "value": "0x23b872dd"
                  },
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 1219,
                    "nodeType": "Block",
                    "src": "16647:486:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1140,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1135,
                              "src": "16661:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 1141,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "16661:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "3634",
                            "id": 1142,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "16676:2:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_64_by_1",
                              "typeString": "int_const 64"
                            },
                            "value": "64"
                          },
                          "src": "16661:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 1156,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1153,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1135,
                                "src": "16748:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              },
                              "id": 1154,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "16748:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "3332",
                              "id": 1155,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "16763:2:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_32_by_1",
                                "typeString": "int_const 32"
                              },
                              "value": "32"
                            },
                            "src": "16748:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": {
                            "id": 1216,
                            "nodeType": "Block",
                            "src": "17090:37:0",
                            "statements": [
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "hexValue": "3f3f3f",
                                  "id": 1214,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "17111:5:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ad68b4dd5516c9b8c2050c111c09e315e44fd13499c6724a87c1b4642b615187",
                                    "typeString": "literal_string \"???\""
                                  },
                                  "value": "???"
                                },
                                "functionReturnParameters": 1139,
                                "id": 1215,
                                "nodeType": "Return",
                                "src": "17104:12:0"
                              }
                            ]
                          },
                          "id": 1217,
                          "nodeType": "IfStatement",
                          "src": "16744:383:0",
                          "trueBody": {
                            "id": 1213,
                            "nodeType": "Block",
                            "src": "16767:317:0",
                            "statements": [
                              {
                                "assignments": [
                                  1158
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 1158,
                                    "mutability": "mutable",
                                    "name": "i",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 1213,
                                    "src": "16781:7:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    "typeName": {
                                      "id": 1157,
                                      "name": "uint8",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "16781:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 1160,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1159,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "16791:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "16781:11:0"
                              },
                              {
                                "body": {
                                  "id": 1173,
                                  "nodeType": "Block",
                                  "src": "16837:36:0",
                                  "statements": [
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1171,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "UnaryOperation",
                                        "operator": "++",
                                        "prefix": false,
                                        "src": "16855:3:0",
                                        "subExpression": {
                                          "argumentTypes": null,
                                          "id": 1170,
                                          "name": "i",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1158,
                                          "src": "16855:1:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint8",
                                            "typeString": "uint8"
                                          }
                                        },
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint8",
                                          "typeString": "uint8"
                                        }
                                      },
                                      "id": 1172,
                                      "nodeType": "ExpressionStatement",
                                      "src": "16855:3:0"
                                    }
                                  ]
                                },
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "id": 1169,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    "id": 1163,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1161,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1158,
                                      "src": "16813:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "<",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "3332",
                                      "id": 1162,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "16817:2:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_32_by_1",
                                        "typeString": "int_const 32"
                                      },
                                      "value": "32"
                                    },
                                    "src": "16813:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "&&",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bytes1",
                                      "typeString": "bytes1"
                                    },
                                    "id": 1168,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 1164,
                                        "name": "data",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1135,
                                        "src": "16823:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      },
                                      "id": 1166,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 1165,
                                        "name": "i",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1158,
                                        "src": "16828:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint8",
                                          "typeString": "uint8"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "16823:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes1",
                                        "typeString": "bytes1"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "!=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 1167,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "16834:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    },
                                    "src": "16823:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "src": "16813:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "id": 1174,
                                "nodeType": "WhileStatement",
                                "src": "16806:67:0"
                              },
                              {
                                "assignments": [
                                  1176
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 1176,
                                    "mutability": "mutable",
                                    "name": "bytesArray",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 1213,
                                    "src": "16886:23:0",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes"
                                    },
                                    "typeName": {
                                      "id": 1175,
                                      "name": "bytes",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "16886:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_storage_ptr",
                                        "typeString": "bytes"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 1181,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1179,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1158,
                                      "src": "16922:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    ],
                                    "id": 1178,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "NewExpression",
                                    "src": "16912:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$",
                                      "typeString": "function (uint256) pure returns (bytes memory)"
                                    },
                                    "typeName": {
                                      "id": 1177,
                                      "name": "bytes",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "16916:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_storage_ptr",
                                        "typeString": "bytes"
                                      }
                                    }
                                  },
                                  "id": 1180,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "16912:12:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "16886:38:0"
                              },
                              {
                                "body": {
                                  "id": 1206,
                                  "nodeType": "Block",
                                  "src": "16979:56:0",
                                  "statements": [
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1204,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 1198,
                                            "name": "bytesArray",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1176,
                                            "src": "16997:10:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            }
                                          },
                                          "id": 1200,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 1199,
                                            "name": "i",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1158,
                                            "src": "17008:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint8",
                                              "typeString": "uint8"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": true,
                                          "nodeType": "IndexAccess",
                                          "src": "16997:13:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes1",
                                            "typeString": "bytes1"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 1201,
                                            "name": "data",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1135,
                                            "src": "17013:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bytes_memory_ptr",
                                              "typeString": "bytes memory"
                                            }
                                          },
                                          "id": 1203,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 1202,
                                            "name": "i",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1158,
                                            "src": "17018:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint8",
                                              "typeString": "uint8"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "17013:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes1",
                                            "typeString": "bytes1"
                                          }
                                        },
                                        "src": "16997:23:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes1",
                                          "typeString": "bytes1"
                                        }
                                      },
                                      "id": 1205,
                                      "nodeType": "ExpressionStatement",
                                      "src": "16997:23:0"
                                    }
                                  ]
                                },
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "id": 1194,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    "id": 1188,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1186,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1158,
                                      "src": "16950:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "<",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "3332",
                                      "id": 1187,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "16954:2:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_32_by_1",
                                        "typeString": "int_const 32"
                                      },
                                      "value": "32"
                                    },
                                    "src": "16950:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "&&",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_bytes1",
                                      "typeString": "bytes1"
                                    },
                                    "id": 1193,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 1189,
                                        "name": "data",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1135,
                                        "src": "16960:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      },
                                      "id": 1191,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 1190,
                                        "name": "i",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1158,
                                        "src": "16965:1:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint8",
                                          "typeString": "uint8"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "16960:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes1",
                                        "typeString": "bytes1"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "!=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 1192,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "16971:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    },
                                    "src": "16960:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "src": "16950:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "id": 1207,
                                "initializationExpression": {
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1184,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 1182,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1158,
                                      "src": "16943:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 1183,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "16947:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    },
                                    "src": "16943:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  "id": 1185,
                                  "nodeType": "ExpressionStatement",
                                  "src": "16943:5:0"
                                },
                                "loopExpression": {
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1196,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "++",
                                    "prefix": false,
                                    "src": "16974:3:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "id": 1195,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1158,
                                      "src": "16974:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  "id": 1197,
                                  "nodeType": "ExpressionStatement",
                                  "src": "16974:3:0"
                                },
                                "nodeType": "ForStatement",
                                "src": "16938:97:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1210,
                                      "name": "bytesArray",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1176,
                                      "src": "17062:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                      }
                                    ],
                                    "id": 1209,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "17055:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                      "typeString": "type(string storage pointer)"
                                    },
                                    "typeName": {
                                      "id": 1208,
                                      "name": "string",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "17055:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 1211,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "17055:18:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                "functionReturnParameters": 1139,
                                "id": 1212,
                                "nodeType": "Return",
                                "src": "17048:25:0"
                              }
                            ]
                          }
                        },
                        "id": 1218,
                        "nodeType": "IfStatement",
                        "src": "16657:470:0",
                        "trueBody": {
                          "id": 1152,
                          "nodeType": "Block",
                          "src": "16680:58:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1146,
                                    "name": "data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1135,
                                    "src": "16712:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1148,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "16719:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                          "typeString": "type(string storage pointer)"
                                        },
                                        "typeName": {
                                          "id": 1147,
                                          "name": "string",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "16719:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      }
                                    ],
                                    "id": 1149,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "16718: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": 1144,
                                    "name": "abi",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -1,
                                    "src": "16701:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_abi",
                                      "typeString": "abi"
                                    }
                                  },
                                  "id": 1145,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "memberName": "decode",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "16701:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                    "typeString": "function () pure"
                                  }
                                },
                                "id": 1150,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "16701:26:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                }
                              },
                              "functionReturnParameters": 1139,
                              "id": 1151,
                              "nodeType": "Return",
                              "src": "16694:33:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1220,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "returnDataToString",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1136,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1135,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1220,
                        "src": "16590:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1134,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "16590:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16589:19:0"
                  },
                  "returnParameters": {
                    "id": 1139,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1138,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1220,
                        "src": "16632:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1137,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "16632:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16631:15:0"
                  },
                  "scope": 1323,
                  "src": "16562:571:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1250,
                    "nodeType": "Block",
                    "src": "17406:173:0",
                    "statements": [
                      {
                        "assignments": [
                          1229,
                          1231
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1229,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1250,
                            "src": "17417:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 1228,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "17417:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 1231,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1250,
                            "src": "17431:17:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 1230,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "17431:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1242,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1239,
                                  "name": "SIG_SYMBOL",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1121,
                                  "src": "17501:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1237,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17478:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1238,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17478:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1240,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17478:34: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": 1234,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1223,
                                  "src": "17460:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$1118",
                                    "typeString": "contract IERC20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$1118",
                                    "typeString": "contract IERC20"
                                  }
                                ],
                                "id": 1233,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "17452:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1232,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "17452:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1235,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17452:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 1236,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "staticcall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "17452:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                            }
                          },
                          "id": 1241,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17452:61:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "17416:97:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "id": 1243,
                            "name": "success",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1229,
                            "src": "17530:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "hexValue": "3f3f3f",
                            "id": 1247,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "17567:5:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_ad68b4dd5516c9b8c2050c111c09e315e44fd13499c6724a87c1b4642b615187",
                              "typeString": "literal_string \"???\""
                            },
                            "value": "???"
                          },
                          "id": 1248,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "17530:42:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1245,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1231,
                                "src": "17559:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "id": 1244,
                              "name": "returnDataToString",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1220,
                              "src": "17540:18: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": 1246,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "17540:24:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 1227,
                        "id": 1249,
                        "nodeType": "Return",
                        "src": "17523:49:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1221,
                    "nodeType": "StructuredDocumentation",
                    "src": "17139:190:0",
                    "text": "@notice Provides a safe ERC20.symbol version which returns '???' as fallback string.\n @param token The address of the ERC-20 token contract.\n @return (string) Token symbol."
                  },
                  "id": 1251,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeSymbol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1224,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1223,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1251,
                        "src": "17354:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1222,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "17354:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17353:14:0"
                  },
                  "returnParameters": {
                    "id": 1227,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1226,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1251,
                        "src": "17391:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1225,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "17391:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17390:15:0"
                  },
                  "scope": 1323,
                  "src": "17334:245:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1281,
                    "nodeType": "Block",
                    "src": "17846:171:0",
                    "statements": [
                      {
                        "assignments": [
                          1260,
                          1262
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1260,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1281,
                            "src": "17857:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 1259,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "17857:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 1262,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1281,
                            "src": "17871:17:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 1261,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "17871:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1273,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1270,
                                  "name": "SIG_NAME",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1124,
                                  "src": "17941:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1268,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17918:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1269,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17918:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1271,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17918:32: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": 1265,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1254,
                                  "src": "17900:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$1118",
                                    "typeString": "contract IERC20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$1118",
                                    "typeString": "contract IERC20"
                                  }
                                ],
                                "id": 1264,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "17892:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1263,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "17892:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1266,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17892:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 1267,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "staticcall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "17892:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                            }
                          },
                          "id": 1272,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17892:59:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "17856:95:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "id": 1274,
                            "name": "success",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1260,
                            "src": "17968:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "hexValue": "3f3f3f",
                            "id": 1278,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "18005:5:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_ad68b4dd5516c9b8c2050c111c09e315e44fd13499c6724a87c1b4642b615187",
                              "typeString": "literal_string \"???\""
                            },
                            "value": "???"
                          },
                          "id": 1279,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "17968:42:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1276,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1262,
                                "src": "17997:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "id": 1275,
                              "name": "returnDataToString",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1220,
                              "src": "17978:18: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": 1277,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "17978:24:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 1258,
                        "id": 1280,
                        "nodeType": "Return",
                        "src": "17961:49:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1252,
                    "nodeType": "StructuredDocumentation",
                    "src": "17585:186:0",
                    "text": "@notice Provides a safe ERC20.name version which returns '???' as fallback string.\n @param token The address of the ERC-20 token contract.\n @return (string) Token name."
                  },
                  "id": 1282,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeName",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1255,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1254,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1282,
                        "src": "17794:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1253,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "17794:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17793:14:0"
                  },
                  "returnParameters": {
                    "id": 1258,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1257,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1282,
                        "src": "17831:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1256,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "17831:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17830:15:0"
                  },
                  "scope": 1323,
                  "src": "17776:241:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1321,
                    "nodeType": "Block",
                    "src": "18285:194:0",
                    "statements": [
                      {
                        "assignments": [
                          1291,
                          1293
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1291,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1321,
                            "src": "18296:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 1290,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "18296:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 1293,
                            "mutability": "mutable",
                            "name": "data",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1321,
                            "src": "18310:17:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 1292,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "18310:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1304,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1301,
                                  "name": "SIG_DECIMALS",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1127,
                                  "src": "18380:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1299,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "18357:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1300,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18357:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1302,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18357:36: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": 1296,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1285,
                                  "src": "18339:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$1118",
                                    "typeString": "contract IERC20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$1118",
                                    "typeString": "contract IERC20"
                                  }
                                ],
                                "id": 1295,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "18331:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1294,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "18331:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1297,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18331:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 1298,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "staticcall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "18331:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                            }
                          },
                          "id": 1303,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18331:63:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "18295:99:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "id": 1310,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1305,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1291,
                              "src": "18411:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "&&",
                            "rightExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1309,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1306,
                                  "name": "data",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1293,
                                  "src": "18422:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "id": 1307,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18422:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "3332",
                                "id": 1308,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "18437:2:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_32_by_1",
                                  "typeString": "int_const 32"
                                },
                                "value": "32"
                              },
                              "src": "18422:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "src": "18411:28:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "hexValue": "3138",
                            "id": 1318,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "18470:2:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_18_by_1",
                              "typeString": "int_const 18"
                            },
                            "value": "18"
                          },
                          "id": 1319,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "18411:61:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1313,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1293,
                                "src": "18453:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1315,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "18460:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint8_$",
                                      "typeString": "type(uint8)"
                                    },
                                    "typeName": {
                                      "id": 1314,
                                      "name": "uint8",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "18460:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  }
                                ],
                                "id": 1316,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "18459:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint8_$",
                                  "typeString": "type(uint8)"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                },
                                {
                                  "typeIdentifier": "t_type$_t_uint8_$",
                                  "typeString": "type(uint8)"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 1311,
                                "name": "abi",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -1,
                                "src": "18442:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_abi",
                                  "typeString": "abi"
                                }
                              },
                              "id": 1312,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "decode",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "18442:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                "typeString": "function () pure"
                              }
                            },
                            "id": 1317,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "18442:25:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 1289,
                        "id": 1320,
                        "nodeType": "Return",
                        "src": "18404:68:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1283,
                    "nodeType": "StructuredDocumentation",
                    "src": "18023:191:0",
                    "text": "@notice Provides a safe ERC20.decimals version which returns '18' as fallback value.\n @param token The address of the ERC-20 token contract.\n @return (uint8) Token decimals."
                  },
                  "id": 1322,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeDecimals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1286,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1285,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1322,
                        "src": "18241:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1284,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "18241:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18240:14:0"
                  },
                  "returnParameters": {
                    "id": 1289,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1288,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1322,
                        "src": "18278:5:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1287,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "18278:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18277:7:0"
                  },
                  "scope": 1323,
                  "src": "18219:260:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 4811,
              "src": "16155:2326:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1340,
              "linearizedBaseContracts": [
                1340
              ],
              "name": "IBatchFlashBorrower",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "d9d17623",
                  "id": 1339,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onBatchFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1337,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1325,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1339,
                        "src": "18656:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1324,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18656:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1328,
                        "mutability": "mutable",
                        "name": "tokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1339,
                        "src": "18680:24:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20_$1118_$dyn_calldata_ptr",
                          "typeString": "contract IERC20[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 1326,
                            "name": "IERC20",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 1118,
                            "src": "18680:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$1118",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 1327,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "18680:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$1118_$dyn_storage_ptr",
                            "typeString": "contract IERC20[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1331,
                        "mutability": "mutable",
                        "name": "amounts",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1339,
                        "src": "18714:26:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1329,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "18714:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 1330,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "18714:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1334,
                        "mutability": "mutable",
                        "name": "fees",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1339,
                        "src": "18750:23:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1332,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "18750:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 1333,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "18750:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1336,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1339,
                        "src": "18783:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1335,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "18783:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18646:162:0"
                  },
                  "returnParameters": {
                    "id": 1338,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18817:0:0"
                  },
                  "scope": 1340,
                  "src": "18621:197:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "18585:235:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1354,
              "linearizedBaseContracts": [
                1354
              ],
              "name": "IFlashBorrower",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "23e30c8b",
                  "id": 1353,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1351,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1342,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1353,
                        "src": "18980:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1341,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18980:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1344,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1353,
                        "src": "19004:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1343,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "19004:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1346,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1353,
                        "src": "19026:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1345,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19026:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1348,
                        "mutability": "mutable",
                        "name": "fee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1353,
                        "src": "19050:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1347,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19050:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1350,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1353,
                        "src": "19071:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1349,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "19071:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18970:126:0"
                  },
                  "returnParameters": {
                    "id": 1352,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19105:0:0"
                  },
                  "scope": 1354,
                  "src": "18950:156:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "18919:189:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1383,
              "linearizedBaseContracts": [
                1383
              ],
              "name": "IStrategy",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "6939aaf5",
                  "id": 1359,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "skim",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1357,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1356,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1359,
                        "src": "19310:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1355,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19310:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19309:16:0"
                  },
                  "returnParameters": {
                    "id": 1358,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19334:0:0"
                  },
                  "scope": 1383,
                  "src": "19296:39:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "18fccc76",
                  "id": 1368,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "harvest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1364,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1361,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1368,
                        "src": "19441:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1360,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19441:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1363,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1368,
                        "src": "19458:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1362,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19458:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19440:33:0"
                  },
                  "returnParameters": {
                    "id": 1367,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1366,
                        "mutability": "mutable",
                        "name": "amountAdded",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1368,
                        "src": "19492:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 1365,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19492:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19491:20:0"
                  },
                  "scope": 1383,
                  "src": "19424:88:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "2e1a7d4d",
                  "id": 1375,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1371,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1370,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1375,
                        "src": "19774:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1369,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19774:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19773:16:0"
                  },
                  "returnParameters": {
                    "id": 1374,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1373,
                        "mutability": "mutable",
                        "name": "actualAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1375,
                        "src": "19808:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1372,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19808:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19807:22:0"
                  },
                  "scope": 1383,
                  "src": "19756:74:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "7f8661a1",
                  "id": 1382,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "exit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1378,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1377,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1382,
                        "src": "19926:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1376,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19926:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19925:17:0"
                  },
                  "returnParameters": {
                    "id": 1381,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1380,
                        "mutability": "mutable",
                        "name": "amountAdded",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1382,
                        "src": "19961:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 1379,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19961:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19960:20:0"
                  },
                  "scope": 1383,
                  "src": "19912:69:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "19202:781:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1796,
              "linearizedBaseContracts": [
                1796
              ],
              "name": "IBentoBoxV1",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1391,
                  "name": "LogDeploy",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1390,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1385,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1391,
                        "src": "20123:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1384,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20123:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1387,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1391,
                        "src": "20155:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1386,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "20155:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1389,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "cloneAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1391,
                        "src": "20167:28:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1388,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20167:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20122:74:0"
                  },
                  "src": "20107:90:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1403,
                  "name": "LogDeposit",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1402,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1393,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1403,
                        "src": "20219:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1392,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20219:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1395,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1403,
                        "src": "20242:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1394,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20242:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1397,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1403,
                        "src": "20264:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1396,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20264:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1399,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1403,
                        "src": "20284:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1398,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20284:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1401,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1403,
                        "src": "20300:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1400,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20300:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20218:96:0"
                  },
                  "src": "20202:113:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1415,
                  "name": "LogFlashLoan",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1414,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1405,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "20339:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1404,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20339:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1407,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "20365:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1406,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20365:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1409,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "20388:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1408,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20388:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1411,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "feeAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "20404:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1410,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20404:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1413,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "receiver",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1415,
                        "src": "20423:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1412,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20423:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20338:110:0"
                  },
                  "src": "20320:129:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1419,
                  "name": "LogRegisterProtocol",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1418,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1417,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "protocol",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1419,
                        "src": "20480:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1416,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20480:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20479:26:0"
                  },
                  "src": "20454:52:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1427,
                  "name": "LogSetMasterContractApproval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1426,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1421,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1427,
                        "src": "20546:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1420,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20546:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1423,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1427,
                        "src": "20578:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1422,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20578:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1425,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1427,
                        "src": "20600:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1424,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "20600:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20545:69:0"
                  },
                  "src": "20511:104:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1433,
                  "name": "LogStrategyDivest",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1432,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1429,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1433,
                        "src": "20644:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1428,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20644:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1431,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1433,
                        "src": "20667:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1430,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20667:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20643:39:0"
                  },
                  "src": "20620:63:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1439,
                  "name": "LogStrategyInvest",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1438,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1435,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1439,
                        "src": "20712:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1434,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20712:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1437,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1439,
                        "src": "20735:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1436,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20735:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20711:39:0"
                  },
                  "src": "20688:63:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1445,
                  "name": "LogStrategyLoss",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1444,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1441,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1445,
                        "src": "20778:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1440,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20778:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1443,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1445,
                        "src": "20801:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1442,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20801:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20777:39:0"
                  },
                  "src": "20756:61:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1451,
                  "name": "LogStrategyProfit",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1450,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1447,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1451,
                        "src": "20846:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1446,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20846:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1449,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1451,
                        "src": "20869:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1448,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20869:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20845:39:0"
                  },
                  "src": "20822:63:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1457,
                  "name": "LogStrategyQueued",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1456,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1453,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1457,
                        "src": "20914:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1452,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20914:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1455,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "strategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1457,
                        "src": "20937:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1454,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20937:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20913:49:0"
                  },
                  "src": "20890:73:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1463,
                  "name": "LogStrategySet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1462,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1459,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1463,
                        "src": "20989:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1458,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20989:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1461,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "strategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1463,
                        "src": "21012:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1460,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21012:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20988:49:0"
                  },
                  "src": "20968:70:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1469,
                  "name": "LogStrategyTargetPercentage",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1468,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1465,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1469,
                        "src": "21077:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1464,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21077:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1467,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "targetPercentage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1469,
                        "src": "21100:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1466,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21100:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21076:49:0"
                  },
                  "src": "21043:83:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1479,
                  "name": "LogTransfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1478,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1471,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1479,
                        "src": "21149:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1470,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21149:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1473,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1479,
                        "src": "21172:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1472,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21172:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1475,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1479,
                        "src": "21194:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1474,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21194:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1477,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1479,
                        "src": "21214:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1476,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21214:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21148:80:0"
                  },
                  "src": "21131:98:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1485,
                  "name": "LogWhiteListMasterContract",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1481,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1485,
                        "src": "21267:30:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1480,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21267:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1483,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1485,
                        "src": "21299:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1482,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21299:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21266:47:0"
                  },
                  "src": "21234:80:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1497,
                  "name": "LogWithdraw",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1496,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1487,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1497,
                        "src": "21337:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1486,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21337:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1489,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1497,
                        "src": "21360:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1488,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21360:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1491,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1497,
                        "src": "21382:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1490,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21382:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1493,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1497,
                        "src": "21402:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1492,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21402:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1495,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1497,
                        "src": "21418:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1494,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21418:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21336:96:0"
                  },
                  "src": "21319:114:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1503,
                  "name": "OwnershipTransferred",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1502,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1499,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "previousOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1503,
                        "src": "21465:29:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1498,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21465:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1501,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1503,
                        "src": "21496:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1500,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21496:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21464:57:0"
                  },
                  "src": "21438:84:0"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f7888aec",
                  "id": 1512,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1508,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1505,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1512,
                        "src": "21547:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1504,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "21547:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1507,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1512,
                        "src": "21555:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1506,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21555:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21546:17:0"
                  },
                  "returnParameters": {
                    "id": 1511,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1510,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1512,
                        "src": "21587:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1509,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21587:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21586:9:0"
                  },
                  "scope": 1796,
                  "src": "21528:68:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "d2423b51",
                  "id": 1526,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "batch",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1518,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1515,
                        "mutability": "mutable",
                        "name": "calls",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1526,
                        "src": "21617:22:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                          "typeString": "bytes[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1513,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "21617:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_storage_ptr",
                              "typeString": "bytes"
                            }
                          },
                          "id": 1514,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "21617:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                            "typeString": "bytes[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1517,
                        "mutability": "mutable",
                        "name": "revertOnFail",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1526,
                        "src": "21641:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1516,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21641:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21616:43:0"
                  },
                  "returnParameters": {
                    "id": 1525,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1521,
                        "mutability": "mutable",
                        "name": "successes",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1526,
                        "src": "21686:23:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                          "typeString": "bool[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1519,
                            "name": "bool",
                            "nodeType": "ElementaryTypeName",
                            "src": "21686:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "id": 1520,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "21686:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                            "typeString": "bool[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1524,
                        "mutability": "mutable",
                        "name": "results",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1526,
                        "src": "21711:22:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes_memory_ptr_$dyn_memory_ptr",
                          "typeString": "bytes[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1522,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "21711:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_storage_ptr",
                              "typeString": "bytes"
                            }
                          },
                          "id": 1523,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "21711:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                            "typeString": "bytes[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21685:49:0"
                  },
                  "scope": 1796,
                  "src": "21602:133:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f483b3da",
                  "id": 1542,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "batchFlashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1540,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1528,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1542,
                        "src": "21774:28:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBatchFlashBorrower_$1340",
                          "typeString": "contract IBatchFlashBorrower"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1527,
                          "name": "IBatchFlashBorrower",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1340,
                          "src": "21774:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IBatchFlashBorrower_$1340",
                            "typeString": "contract IBatchFlashBorrower"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1531,
                        "mutability": "mutable",
                        "name": "receivers",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1542,
                        "src": "21812:28:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1529,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "21812:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 1530,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "21812:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1534,
                        "mutability": "mutable",
                        "name": "tokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1542,
                        "src": "21850:24:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20_$1118_$dyn_calldata_ptr",
                          "typeString": "contract IERC20[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 1532,
                            "name": "IERC20",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 1118,
                            "src": "21850:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$1118",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 1533,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "21850:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$1118_$dyn_storage_ptr",
                            "typeString": "contract IERC20[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1537,
                        "mutability": "mutable",
                        "name": "amounts",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1542,
                        "src": "21884:26:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1535,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "21884:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 1536,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "21884:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1539,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1542,
                        "src": "21920:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1538,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "21920:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21764:181:0"
                  },
                  "returnParameters": {
                    "id": 1541,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21954:0:0"
                  },
                  "scope": 1796,
                  "src": "21741:214:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "4e71e0c8",
                  "id": 1545,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1543,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21984:2:0"
                  },
                  "returnParameters": {
                    "id": 1544,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21995:0:0"
                  },
                  "scope": 1796,
                  "src": "21961:35:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "1f54245b",
                  "id": 1554,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deploy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1552,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1547,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1554,
                        "src": "22027:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1546,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22027:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1549,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1554,
                        "src": "22059:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1548,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "22059:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1551,
                        "mutability": "mutable",
                        "name": "useCreate2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1554,
                        "src": "22088:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1550,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "22088:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22017:92:0"
                  },
                  "returnParameters": {
                    "id": 1553,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22126:0:0"
                  },
                  "scope": 1796,
                  "src": "22002:125:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "02b9446c",
                  "id": 1571,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1565,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1556,
                        "mutability": "mutable",
                        "name": "token_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1571,
                        "src": "22159:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1555,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "22159:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1558,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1571,
                        "src": "22182:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1557,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22182:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1560,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1571,
                        "src": "22204:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1559,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22204:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1562,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1571,
                        "src": "22224:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1561,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22224:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1564,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1571,
                        "src": "22248:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1563,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22248:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22149:118:0"
                  },
                  "returnParameters": {
                    "id": 1570,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1567,
                        "mutability": "mutable",
                        "name": "amountOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1571,
                        "src": "22294:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1566,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22294:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1569,
                        "mutability": "mutable",
                        "name": "shareOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1571,
                        "src": "22313:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1568,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22313:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22293:37:0"
                  },
                  "scope": 1796,
                  "src": "22133:198:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f1676d37",
                  "id": 1584,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "flashLoan",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1582,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1573,
                        "mutability": "mutable",
                        "name": "borrower",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1584,
                        "src": "22365:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IFlashBorrower_$1354",
                          "typeString": "contract IFlashBorrower"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1572,
                          "name": "IFlashBorrower",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1354,
                          "src": "22365:14:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IFlashBorrower_$1354",
                            "typeString": "contract IFlashBorrower"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1575,
                        "mutability": "mutable",
                        "name": "receiver",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1584,
                        "src": "22398:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1574,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22398:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1577,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1584,
                        "src": "22424:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1576,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "22424:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1579,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1584,
                        "src": "22446:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1578,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22446:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1581,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1584,
                        "src": "22470:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1580,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "22470:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22355:140:0"
                  },
                  "returnParameters": {
                    "id": 1583,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22504:0:0"
                  },
                  "scope": 1796,
                  "src": "22337:168:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "66c6bb0b",
                  "id": 1593,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "harvest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1591,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1586,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1593,
                        "src": "22537:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1585,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "22537:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1588,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1593,
                        "src": "22559:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1587,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "22559:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1590,
                        "mutability": "mutable",
                        "name": "maxChangeAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1593,
                        "src": "22581:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1589,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22581:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22527:83:0"
                  },
                  "returnParameters": {
                    "id": 1592,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22619:0:0"
                  },
                  "scope": 1796,
                  "src": "22511:109:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "91e0eab5",
                  "id": 1602,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "masterContractApproved",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1598,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1595,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1602,
                        "src": "22658:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1594,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22658:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1597,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1602,
                        "src": "22667:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1596,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22667:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22657:18:0"
                  },
                  "returnParameters": {
                    "id": 1601,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1600,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1602,
                        "src": "22699:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1599,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "22699:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22698:6:0"
                  },
                  "scope": 1796,
                  "src": "22626:79:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "bafe4f14",
                  "id": 1609,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "masterContractOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1605,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1604,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1609,
                        "src": "22737:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1603,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22737:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22736:9:0"
                  },
                  "returnParameters": {
                    "id": 1608,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1607,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1609,
                        "src": "22769:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1606,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22769:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22768:9:0"
                  },
                  "scope": 1796,
                  "src": "22711:67:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "7ecebe00",
                  "id": 1616,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "nonces",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1612,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1611,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1616,
                        "src": "22800:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1610,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22800:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22799:9:0"
                  },
                  "returnParameters": {
                    "id": 1615,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1614,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1616,
                        "src": "22832:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1613,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22832:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22831:9:0"
                  },
                  "scope": 1796,
                  "src": "22784:57:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "8da5cb5b",
                  "id": 1621,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "owner",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1617,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22861:2:0"
                  },
                  "returnParameters": {
                    "id": 1620,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1619,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1621,
                        "src": "22887:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1618,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22887:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22886:9:0"
                  },
                  "scope": 1796,
                  "src": "22847:49:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "e30c3978",
                  "id": 1626,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "pendingOwner",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1622,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22923:2:0"
                  },
                  "returnParameters": {
                    "id": 1625,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1624,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1626,
                        "src": "22949:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1623,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22949:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22948:9:0"
                  },
                  "scope": 1796,
                  "src": "22902:56:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "5108a558",
                  "id": 1633,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "pendingStrategy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1629,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1628,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1633,
                        "src": "22989:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1627,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "22989:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22988:8:0"
                  },
                  "returnParameters": {
                    "id": 1632,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1631,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1633,
                        "src": "23020:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$1383",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1630,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1383,
                          "src": "23020:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$1383",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23019:11:0"
                  },
                  "scope": 1796,
                  "src": "22964:67:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "7c516e94",
                  "id": 1652,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permitToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1650,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1635,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1652,
                        "src": "23067:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1634,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "23067:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1637,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1652,
                        "src": "23089:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1636,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23089:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1639,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1652,
                        "src": "23111:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1638,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23111:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1641,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1652,
                        "src": "23131:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1640,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "23131:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1643,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1652,
                        "src": "23155:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1642,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "23155:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1645,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1652,
                        "src": "23181:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1644,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "23181:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1647,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1652,
                        "src": "23198:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1646,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "23198:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1649,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1652,
                        "src": "23217:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1648,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "23217:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23057:175:0"
                  },
                  "returnParameters": {
                    "id": 1651,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23241:0:0"
                  },
                  "scope": 1796,
                  "src": "23037:205:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "aee4d1b2",
                  "id": 1655,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "registerProtocol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1653,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23273:2:0"
                  },
                  "returnParameters": {
                    "id": 1654,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23284:0:0"
                  },
                  "scope": 1796,
                  "src": "23248:37:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "c0a47c93",
                  "id": 1670,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setMasterContractApproval",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1668,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1657,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1670,
                        "src": "23335:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1656,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23335:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1659,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1670,
                        "src": "23357:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1658,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23357:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1661,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1670,
                        "src": "23389:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1660,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23389:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1663,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1670,
                        "src": "23412:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1662,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "23412:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1665,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1670,
                        "src": "23429:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1664,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "23429:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1667,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1670,
                        "src": "23448:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 1666,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "23448:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23325:138:0"
                  },
                  "returnParameters": {
                    "id": 1669,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23472:0:0"
                  },
                  "scope": 1796,
                  "src": "23291:182:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "72cb5d97",
                  "id": 1677,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setStrategy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1675,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1672,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1677,
                        "src": "23500:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1671,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "23500:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1674,
                        "mutability": "mutable",
                        "name": "newStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1677,
                        "src": "23514:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$1383",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1673,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1383,
                          "src": "23514:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$1383",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23499:37:0"
                  },
                  "returnParameters": {
                    "id": 1676,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23545:0:0"
                  },
                  "scope": 1796,
                  "src": "23479:67:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "3e2a9d4e",
                  "id": 1684,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setStrategyTargetPercentage",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1682,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1679,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1684,
                        "src": "23589:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1678,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "23589:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1681,
                        "mutability": "mutable",
                        "name": "targetPercentage_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1684,
                        "src": "23603:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 1680,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "23603:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23588:40:0"
                  },
                  "returnParameters": {
                    "id": 1683,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23637:0:0"
                  },
                  "scope": 1796,
                  "src": "23552:86:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "228bfd9f",
                  "id": 1691,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "strategy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1687,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1686,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1691,
                        "src": "23662:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1685,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "23662:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23661:8:0"
                  },
                  "returnParameters": {
                    "id": 1690,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1689,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1691,
                        "src": "23693:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IStrategy_$1383",
                          "typeString": "contract IStrategy"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1688,
                          "name": "IStrategy",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1383,
                          "src": "23693:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IStrategy_$1383",
                            "typeString": "contract IStrategy"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23692:11:0"
                  },
                  "scope": 1796,
                  "src": "23644:60:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "df23b45b",
                  "id": 1702,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "strategyData",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1694,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1693,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1702,
                        "src": "23732:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1692,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "23732:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23731:8:0"
                  },
                  "returnParameters": {
                    "id": 1701,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1696,
                        "mutability": "mutable",
                        "name": "strategyStartDate",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1702,
                        "src": "23800:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 1695,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "23800:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1698,
                        "mutability": "mutable",
                        "name": "targetPercentage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1702,
                        "src": "23838:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 1697,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "23838:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1700,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1702,
                        "src": "23875:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 1699,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "23875:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23786:114:0"
                  },
                  "scope": 1796,
                  "src": "23710:191:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "56623118",
                  "id": 1713,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1709,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1704,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1713,
                        "src": "23934:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1703,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "23934:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1706,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1713,
                        "src": "23956:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1705,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "23956:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1708,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1713,
                        "src": "23979:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1707,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23979:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23924:73:0"
                  },
                  "returnParameters": {
                    "id": 1712,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1711,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1713,
                        "src": "24021:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1710,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24021:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24020:16:0"
                  },
                  "scope": 1796,
                  "src": "23907:130:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "da5139ca",
                  "id": 1724,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toShare",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1720,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1715,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1724,
                        "src": "24069:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1714,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "24069:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1717,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1724,
                        "src": "24091:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1716,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24091:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1719,
                        "mutability": "mutable",
                        "name": "roundUp",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1724,
                        "src": "24115:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1718,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24115:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24059:74:0"
                  },
                  "returnParameters": {
                    "id": 1723,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1722,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1724,
                        "src": "24157:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1721,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24157:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24156:15:0"
                  },
                  "scope": 1796,
                  "src": "24043:129:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "4ffe34db",
                  "id": 1731,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1727,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1726,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1731,
                        "src": "24194:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1725,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "24194:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24193:8:0"
                  },
                  "returnParameters": {
                    "id": 1730,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1729,
                        "mutability": "mutable",
                        "name": "totals_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1731,
                        "src": "24225:21:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                          "typeString": "struct Rebase"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1728,
                          "name": "Rebase",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 753,
                          "src": "24225:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                            "typeString": "struct Rebase"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24224:23:0"
                  },
                  "scope": 1796,
                  "src": "24178:70:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f18d03cc",
                  "id": 1742,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1740,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1733,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1742,
                        "src": "24281:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1732,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "24281:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1735,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1742,
                        "src": "24303:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1734,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24303:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1737,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1742,
                        "src": "24325:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1736,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24325:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1739,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1742,
                        "src": "24345:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1738,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24345:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24271:93:0"
                  },
                  "returnParameters": {
                    "id": 1741,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24373:0:0"
                  },
                  "scope": 1796,
                  "src": "24254:120:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "0fca8843",
                  "id": 1755,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferMultiple",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1753,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1744,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1755,
                        "src": "24415:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1743,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "24415:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1746,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1755,
                        "src": "24437:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1745,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24437:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1749,
                        "mutability": "mutable",
                        "name": "tos",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1755,
                        "src": "24459:22:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1747,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "24459:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 1748,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "24459:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1752,
                        "mutability": "mutable",
                        "name": "shares",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1755,
                        "src": "24491:25:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1750,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "24491:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 1751,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "24491:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24405:117:0"
                  },
                  "returnParameters": {
                    "id": 1754,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24531:0:0"
                  },
                  "scope": 1796,
                  "src": "24380:152:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "078dfbe7",
                  "id": 1764,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1762,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1757,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1764,
                        "src": "24574:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1756,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24574:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1759,
                        "mutability": "mutable",
                        "name": "direct",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1764,
                        "src": "24600:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1758,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24600:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1761,
                        "mutability": "mutable",
                        "name": "renounce",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1764,
                        "src": "24621:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1760,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24621:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24564:76:0"
                  },
                  "returnParameters": {
                    "id": 1763,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24649:0:0"
                  },
                  "scope": 1796,
                  "src": "24538:112:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "733a9d7c",
                  "id": 1771,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "whitelistMasterContract",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1769,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1766,
                        "mutability": "mutable",
                        "name": "masterContract",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1771,
                        "src": "24689:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1765,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24689:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1768,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1771,
                        "src": "24713:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1767,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24713:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24688:39:0"
                  },
                  "returnParameters": {
                    "id": 1770,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24736:0:0"
                  },
                  "scope": 1796,
                  "src": "24656:81:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "12a90c8a",
                  "id": 1778,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "whitelistedMasterContracts",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1774,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1773,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1778,
                        "src": "24779:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1772,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24779:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24778:9:0"
                  },
                  "returnParameters": {
                    "id": 1777,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1776,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1778,
                        "src": "24811:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1775,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24811:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24810:6:0"
                  },
                  "scope": 1796,
                  "src": "24743:74:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "97da6d30",
                  "id": 1795,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1789,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1780,
                        "mutability": "mutable",
                        "name": "token_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1795,
                        "src": "24850:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1779,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "24850:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1782,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1795,
                        "src": "24873:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1781,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24873:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1784,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1795,
                        "src": "24895:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1783,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24895:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1786,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1795,
                        "src": "24915:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1785,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24915:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1788,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1795,
                        "src": "24939:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1787,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24939:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24840:118:0"
                  },
                  "returnParameters": {
                    "id": 1794,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1791,
                        "mutability": "mutable",
                        "name": "amountOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1795,
                        "src": "24977:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1790,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24977:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1793,
                        "mutability": "mutable",
                        "name": "shareOut",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1795,
                        "src": "24996:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1792,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24996:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24976:37:0"
                  },
                  "scope": 1796,
                  "src": "24823:191:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "20079:4937:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1841,
              "linearizedBaseContracts": [
                1841
              ],
              "name": "IOracle",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 1797,
                    "nodeType": "StructuredDocumentation",
                    "src": "25111:484:0",
                    "text": "@notice Get the latest exchange rate.\n @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n For example:\n (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n @return success if no valid (recent) rate is available, return false else true.\n @return rate The rate of the requested asset / pair / pool."
                  },
                  "functionSelector": "d6d7d525",
                  "id": 1806,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "get",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1800,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1799,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1806,
                        "src": "25613:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1798,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "25613:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25612:21:0"
                  },
                  "returnParameters": {
                    "id": 1805,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1802,
                        "mutability": "mutable",
                        "name": "success",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1806,
                        "src": "25652:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1801,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "25652:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1804,
                        "mutability": "mutable",
                        "name": "rate",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1806,
                        "src": "25666:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1803,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "25666:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25651:28:0"
                  },
                  "scope": 1841,
                  "src": "25600:80:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1807,
                    "nodeType": "StructuredDocumentation",
                    "src": "25686:510:0",
                    "text": "@notice Check the last exchange rate without any state changes.\n @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n For example:\n (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n @return success if no valid (recent) rate is available, return false else true.\n @return rate The rate of the requested asset / pair / pool."
                  },
                  "functionSelector": "eeb8a8d3",
                  "id": 1816,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "peek",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1810,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1809,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1816,
                        "src": "26215:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1808,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "26215:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26214:21:0"
                  },
                  "returnParameters": {
                    "id": 1815,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1812,
                        "mutability": "mutable",
                        "name": "success",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1816,
                        "src": "26259:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1811,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "26259:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1814,
                        "mutability": "mutable",
                        "name": "rate",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1816,
                        "src": "26273:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1813,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "26273:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26258:28:0"
                  },
                  "scope": 1841,
                  "src": "26201:86:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1817,
                    "nodeType": "StructuredDocumentation",
                    "src": "26293:488:0",
                    "text": "@notice Check the current spot exchange rate without any state changes. For oracles like TWAP this will be different from peek().\n @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n For example:\n (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n @return rate The rate of the requested asset / pair / pool."
                  },
                  "functionSelector": "d39bbef0",
                  "id": 1824,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "peekSpot",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1820,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1819,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1824,
                        "src": "26804:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1818,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "26804:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26803:21:0"
                  },
                  "returnParameters": {
                    "id": 1823,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1822,
                        "mutability": "mutable",
                        "name": "rate",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1824,
                        "src": "26848:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1821,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "26848:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26847:14:0"
                  },
                  "scope": 1841,
                  "src": "26786:76:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1825,
                    "nodeType": "StructuredDocumentation",
                    "src": "26868:428:0",
                    "text": "@notice Returns a human readable (short) name about this oracle.\n @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n For example:\n (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n @return (string) A human readable symbol name about this oracle."
                  },
                  "functionSelector": "c699c4d6",
                  "id": 1832,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "symbol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1828,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1827,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1832,
                        "src": "27317:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1826,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "27317:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27316:21:0"
                  },
                  "returnParameters": {
                    "id": 1831,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1830,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1832,
                        "src": "27361:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1829,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "27361:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27360:15:0"
                  },
                  "scope": 1841,
                  "src": "27301:75:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1833,
                    "nodeType": "StructuredDocumentation",
                    "src": "27382:413:0",
                    "text": "@notice Returns a human readable name about this oracle.\n @param data Usually abi encoded, implementation specific data that contains information and arguments to & about the oracle.\n For example:\n (string memory collateralSymbol, string memory assetSymbol, uint256 division) = abi.decode(data, (string, string, uint256));\n @return (string) A human readable name about this oracle."
                  },
                  "functionSelector": "d568866c",
                  "id": 1840,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "name",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1836,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1835,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1840,
                        "src": "27814:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1834,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "27814:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27813:21:0"
                  },
                  "returnParameters": {
                    "id": 1839,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1838,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1840,
                        "src": "27858:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1837,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "27858:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27857:15:0"
                  },
                  "scope": 1841,
                  "src": "27800:73:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "25087:2788:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1880,
              "linearizedBaseContracts": [
                1880
              ],
              "name": "ISwapper",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 1842,
                    "nodeType": "StructuredDocumentation",
                    "src": "27972:403:0",
                    "text": "@notice Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\n Swaps it for at least 'amountToMin' of token 'to'.\n Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\n Returns the amount of tokens 'to' transferred to BentoBox.\n (The BentoBox skim function will be used by the caller to get the swapped funds)."
                  },
                  "functionSelector": "e343fe12",
                  "id": 1859,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "swap",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1853,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1844,
                        "mutability": "mutable",
                        "name": "fromToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1859,
                        "src": "28403:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1843,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "28403:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1846,
                        "mutability": "mutable",
                        "name": "toToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1859,
                        "src": "28429:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1845,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "28429:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1848,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1859,
                        "src": "28453:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1847,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28453:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1850,
                        "mutability": "mutable",
                        "name": "shareToMin",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1859,
                        "src": "28480:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1849,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28480:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1852,
                        "mutability": "mutable",
                        "name": "shareFrom",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1859,
                        "src": "28508:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1851,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28508:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28393:138:0"
                  },
                  "returnParameters": {
                    "id": 1858,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1855,
                        "mutability": "mutable",
                        "name": "extraShare",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1859,
                        "src": "28550:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1854,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28550:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1857,
                        "mutability": "mutable",
                        "name": "shareReturned",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1859,
                        "src": "28570:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1856,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28570:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28549:43:0"
                  },
                  "scope": 1880,
                  "src": "28380:213:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1860,
                    "nodeType": "StructuredDocumentation",
                    "src": "28599:685:0",
                    "text": "@notice Calculates the amount of token 'from' needed to complete the swap (amountFrom),\n this should be less than or equal to amountFromMax.\n Withdraws 'amountFrom' of token 'from' from the BentoBox account for this swapper.\n Swaps it for exactly 'exactAmountTo' of token 'to'.\n Transfers the swapped tokens of 'to' into the BentoBox using a plain ERC20 transfer.\n Transfers allocated, but unused 'from' tokens within the BentoBox to 'refundTo' (amountFromMax - amountFrom).\n Returns the amount of 'from' tokens withdrawn from BentoBox (amountFrom).\n (The BentoBox skim function will be used by the caller to get the swapped funds)."
                  },
                  "functionSelector": "4622be90",
                  "id": 1879,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "swapExact",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1873,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1862,
                        "mutability": "mutable",
                        "name": "fromToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1879,
                        "src": "29317:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1861,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "29317:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1864,
                        "mutability": "mutable",
                        "name": "toToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1879,
                        "src": "29343:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1863,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "29343:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1866,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1879,
                        "src": "29367:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1865,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "29367:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1868,
                        "mutability": "mutable",
                        "name": "refundTo",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1879,
                        "src": "29394:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1867,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "29394:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1870,
                        "mutability": "mutable",
                        "name": "shareFromSupplied",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1879,
                        "src": "29420:25:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1869,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29420:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1872,
                        "mutability": "mutable",
                        "name": "shareToExact",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1879,
                        "src": "29455:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1871,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29455:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29307:174:0"
                  },
                  "returnParameters": {
                    "id": 1878,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1875,
                        "mutability": "mutable",
                        "name": "shareUsed",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1879,
                        "src": "29500:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1874,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29500:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1877,
                        "mutability": "mutable",
                        "name": "shareReturned",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1879,
                        "src": "29519:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1876,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29519:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29499:42:0"
                  },
                  "scope": 1880,
                  "src": "29289:253:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 4811,
              "src": "27947:1597:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1882,
                    "name": "ERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 741,
                    "src": "29868:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20_$741",
                      "typeString": "contract ERC20"
                    }
                  },
                  "id": 1883,
                  "nodeType": "InheritanceSpecifier",
                  "src": "29868:5:0"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1884,
                    "name": "BoringOwnable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 328,
                    "src": "29875:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringOwnable_$328",
                      "typeString": "contract BoringOwnable"
                    }
                  },
                  "id": 1885,
                  "nodeType": "InheritanceSpecifier",
                  "src": "29875:13:0"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1886,
                    "name": "IMasterContract",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 748,
                    "src": "29890:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IMasterContract_$748",
                      "typeString": "contract IMasterContract"
                    }
                  },
                  "id": 1887,
                  "nodeType": "InheritanceSpecifier",
                  "src": "29890:15:0"
                }
              ],
              "contractDependencies": [
                205,
                328,
                418,
                436,
                741,
                748
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 1881,
                "nodeType": "StructuredDocumentation",
                "src": "29642:192:0",
                "text": "@title KashiPair\n @dev This contract allows contract calls to any contract (except BentoBox)\n from arbitrary callers thus, don't trust calls from this contract in any circumstances."
              },
              "fullyImplemented": true,
              "id": 4810,
              "linearizedBaseContracts": [
                4810,
                748,
                328,
                205,
                741,
                418,
                436
              ],
              "name": "KashiPairMediumRiskV1",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 1890,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1888,
                    "name": "BoringMath",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 154,
                    "src": "29918:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath_$154",
                      "typeString": "library BoringMath"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "29912:29:0",
                  "typeName": {
                    "id": 1889,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29933:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 1893,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1891,
                    "name": "BoringMath128",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 200,
                    "src": "29952:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringMath128_$200",
                      "typeString": "library BoringMath128"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "29946:32:0",
                  "typeName": {
                    "id": 1892,
                    "name": "uint128",
                    "nodeType": "ElementaryTypeName",
                    "src": "29970:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint128",
                      "typeString": "uint128"
                    }
                  }
                },
                {
                  "id": 1896,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1894,
                    "name": "RebaseLibrary",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1053,
                    "src": "29989:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_RebaseLibrary_$1053",
                      "typeString": "library RebaseLibrary"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "29983:31:0",
                  "typeName": {
                    "contractScope": null,
                    "id": 1895,
                    "name": "Rebase",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 753,
                    "src": "30007:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                      "typeString": "struct Rebase"
                    }
                  }
                },
                {
                  "id": 1899,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1897,
                    "name": "BoringERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1323,
                    "src": "30025:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BoringERC20_$1323",
                      "typeString": "library BoringERC20"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "30019:29:0",
                  "typeName": {
                    "contractScope": null,
                    "id": 1898,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1118,
                    "src": "30041:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$1118",
                      "typeString": "contract IERC20"
                    }
                  }
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1903,
                  "name": "LogExchangeRate",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1902,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1901,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "rate",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1903,
                        "src": "30076:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1900,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30076:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30075:14:0"
                  },
                  "src": "30054:36:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1913,
                  "name": "LogAccrue",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1912,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1905,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "accruedAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1913,
                        "src": "30111:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1904,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30111:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1907,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "feeFraction",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1913,
                        "src": "30134:19:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1906,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30134:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1909,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "rate",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1913,
                        "src": "30155:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 1908,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "30155:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1911,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "utilization",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1913,
                        "src": "30168:19:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1910,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30168:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30110:78:0"
                  },
                  "src": "30095:94:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1921,
                  "name": "LogAddCollateral",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1920,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1915,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1921,
                        "src": "30217:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1914,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30217:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1917,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1921,
                        "src": "30239:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1916,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30239:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1919,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1921,
                        "src": "30259:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1918,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30259:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30216:57:0"
                  },
                  "src": "30194:80:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1931,
                  "name": "LogAddAsset",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1930,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1923,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1931,
                        "src": "30297:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1922,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30297:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1925,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1931,
                        "src": "30319:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1924,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30319:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1927,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1931,
                        "src": "30339:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1926,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30339:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1929,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "fraction",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1931,
                        "src": "30354:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1928,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30354:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30296:75:0"
                  },
                  "src": "30279:93:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1939,
                  "name": "LogRemoveCollateral",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1938,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1933,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1939,
                        "src": "30403:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1932,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30403:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1935,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1939,
                        "src": "30425:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1934,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30425:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1937,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1939,
                        "src": "30445:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1936,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30445:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30402:57:0"
                  },
                  "src": "30377:83:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1949,
                  "name": "LogRemoveAsset",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1948,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1941,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1949,
                        "src": "30486:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1940,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30486:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1943,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1949,
                        "src": "30508:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1942,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30508:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1945,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1949,
                        "src": "30528:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1944,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30528:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1947,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "fraction",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1949,
                        "src": "30543:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1946,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30543:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30485:75:0"
                  },
                  "src": "30465:96:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1961,
                  "name": "LogBorrow",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1960,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1951,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1961,
                        "src": "30582:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1950,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30582:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1953,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1961,
                        "src": "30604:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1952,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30604:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1955,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1961,
                        "src": "30624:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1954,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30624:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1957,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "feeAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1961,
                        "src": "30640:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1956,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30640:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1959,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "part",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1961,
                        "src": "30659:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1958,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30659:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30581:91:0"
                  },
                  "src": "30566:107:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1971,
                  "name": "LogRepay",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1970,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1963,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1971,
                        "src": "30693:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1962,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30693:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1965,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1971,
                        "src": "30715:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1964,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30715:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1967,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1971,
                        "src": "30735:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1966,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30735:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1969,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "part",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1971,
                        "src": "30751:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1968,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30751:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30692:72:0"
                  },
                  "src": "30678:87:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1975,
                  "name": "LogFeeTo",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1974,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1973,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "newFeeTo",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1975,
                        "src": "30785:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1972,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30785:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30784:26:0"
                  },
                  "src": "30770:41:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1981,
                  "name": "LogWithdrawFees",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1980,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1977,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "feeTo",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1981,
                        "src": "30838:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1976,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30838:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1979,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "feesEarnedFraction",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1981,
                        "src": "30861:26:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1978,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30861:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30837:51:0"
                  },
                  "src": "30816:73:0"
                },
                {
                  "constant": false,
                  "functionSelector": "6b2ace87",
                  "id": 1983,
                  "mutability": "immutable",
                  "name": "bentoBox",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "30949:37:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                    "typeString": "contract IBentoBoxV1"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1982,
                    "name": "IBentoBoxV1",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1796,
                    "src": "30949:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                      "typeString": "contract IBentoBoxV1"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "cd446e22",
                  "id": 1985,
                  "mutability": "immutable",
                  "name": "masterContract",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "30992:53:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                    "typeString": "contract KashiPairMediumRiskV1"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1984,
                    "name": "KashiPairMediumRiskV1",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 4810,
                    "src": "30992:21:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                      "typeString": "contract KashiPairMediumRiskV1"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "017e7e58",
                  "id": 1987,
                  "mutability": "mutable",
                  "name": "feeTo",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31084:20:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1986,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "31084:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "8cad7fbe",
                  "id": 1991,
                  "mutability": "mutable",
                  "name": "swappers",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31110:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_ISwapper_$1880_$_t_bool_$",
                    "typeString": "mapping(contract ISwapper => bool)"
                  },
                  "typeName": {
                    "id": 1990,
                    "keyType": {
                      "contractScope": null,
                      "id": 1988,
                      "name": "ISwapper",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 1880,
                      "src": "31118:8:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ISwapper_$1880",
                        "typeString": "contract ISwapper"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "31110:25:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_ISwapper_$1880_$_t_bool_$",
                      "typeString": "mapping(contract ISwapper => bool)"
                    },
                    "valueType": {
                      "id": 1989,
                      "name": "bool",
                      "nodeType": "ElementaryTypeName",
                      "src": "31130:4:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "d8dfeb45",
                  "id": 1993,
                  "mutability": "mutable",
                  "name": "collateral",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31212:24:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$1118",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1992,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1118,
                    "src": "31212:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$1118",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "38d52e0f",
                  "id": 1995,
                  "mutability": "mutable",
                  "name": "asset",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31242:19:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$1118",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1994,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1118,
                    "src": "31242:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$1118",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "7dc0d1d0",
                  "id": 1997,
                  "mutability": "mutable",
                  "name": "oracle",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31267:21:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IOracle_$1841",
                    "typeString": "contract IOracle"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1996,
                    "name": "IOracle",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1841,
                    "src": "31267:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IOracle_$1841",
                      "typeString": "contract IOracle"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "74645ff3",
                  "id": 1999,
                  "mutability": "mutable",
                  "name": "oracleData",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31294:23:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_storage",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 1998,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "31294:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "473e3ce7",
                  "id": 2001,
                  "mutability": "mutable",
                  "name": "totalCollateralShare",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31345:35:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2000,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31345:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "f9557ccb",
                  "id": 2003,
                  "mutability": "mutable",
                  "name": "totalAsset",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31415:24:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Rebase_$753_storage",
                    "typeString": "struct Rebase"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2002,
                    "name": "Rebase",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 753,
                    "src": "31415:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                      "typeString": "struct Rebase"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "8285ef40",
                  "id": 2005,
                  "mutability": "mutable",
                  "name": "totalBorrow",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31544:25:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Rebase_$753_storage",
                    "typeString": "struct Rebase"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2004,
                    "name": "Rebase",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 753,
                    "src": "31544:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                      "typeString": "struct Rebase"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "1c9e379b",
                  "id": 2009,
                  "mutability": "mutable",
                  "name": "userCollateralShare",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31706:54:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 2008,
                    "keyType": {
                      "id": 2006,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "31714:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "31706:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 2007,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "31725:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "48e4163e",
                  "id": 2013,
                  "mutability": "mutable",
                  "name": "userBorrowPart",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "31855:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 2012,
                    "keyType": {
                      "id": 2010,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "31863:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "31855:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 2011,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "31874:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 2014,
                    "nodeType": "StructuredDocumentation",
                    "src": "31911:126:0",
                    "text": "@notice Exchange and interest rate tracking.\n This is 'cached' here because calls to Oracles can be very expensive."
                  },
                  "functionSelector": "3ba0b9a9",
                  "id": 2016,
                  "mutability": "mutable",
                  "name": "exchangeRate",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "32042:27:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2015,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "32042:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "canonicalName": "KashiPairMediumRiskV1.AccrueInfo",
                  "id": 2023,
                  "members": [
                    {
                      "constant": false,
                      "id": 2018,
                      "mutability": "mutable",
                      "name": "interestPerSecond",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2023,
                      "src": "32104:24:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      },
                      "typeName": {
                        "id": 2017,
                        "name": "uint64",
                        "nodeType": "ElementaryTypeName",
                        "src": "32104:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 2020,
                      "mutability": "mutable",
                      "name": "lastAccrued",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2023,
                      "src": "32138:18:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      },
                      "typeName": {
                        "id": 2019,
                        "name": "uint64",
                        "nodeType": "ElementaryTypeName",
                        "src": "32138:6:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 2022,
                      "mutability": "mutable",
                      "name": "feesEarnedFraction",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2023,
                      "src": "32166:26:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      },
                      "typeName": {
                        "id": 2021,
                        "name": "uint128",
                        "nodeType": "ElementaryTypeName",
                        "src": "32166:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "AccrueInfo",
                  "nodeType": "StructDefinition",
                  "scope": 4810,
                  "src": "32076:123:0",
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "b27c0e74",
                  "id": 2025,
                  "mutability": "mutable",
                  "name": "accrueInfo",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "32205:28:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                    "typeString": "struct KashiPairMediumRiskV1.AccrueInfo"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2024,
                    "name": "AccrueInfo",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 2023,
                    "src": "32205:10:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage_ptr",
                      "typeString": "struct KashiPairMediumRiskV1.AccrueInfo"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2050,
                    "nodeType": "Block",
                    "src": "32321:136:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6b6d",
                                  "id": 2034,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32362:4:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_dbfa5bef228160978b860ed675aab7f09ac4fbd629b3686f074f60d7f70aa633",
                                    "typeString": "literal_string \"km\""
                                  },
                                  "value": "km"
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2035,
                                      "name": "collateral",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1993,
                                      "src": "32368:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$1118",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 2036,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "safeSymbol",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1251,
                                    "src": "32368:21:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$1118_$returns$_t_string_memory_ptr_$bound_to$_t_contract$_IERC20_$1118_$",
                                      "typeString": "function (contract IERC20) view returns (string memory)"
                                    }
                                  },
                                  "id": 2037,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "32368:23:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "2f",
                                  "id": 2038,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32393:3:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_fba9715e477e68952d3f1df7a185b3708aadad50ec10cc793973864023868527",
                                    "typeString": "literal_string \"/\""
                                  },
                                  "value": "/"
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2039,
                                      "name": "asset",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1995,
                                      "src": "32398:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$1118",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 2040,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "safeSymbol",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1251,
                                    "src": "32398:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$1118_$returns$_t_string_memory_ptr_$bound_to$_t_contract$_IERC20_$1118_$",
                                      "typeString": "function (contract IERC20) view returns (string memory)"
                                    }
                                  },
                                  "id": 2041,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "32398:18:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "2d",
                                  "id": 2042,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32418:3:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561",
                                    "typeString": "literal_string \"-\""
                                  },
                                  "value": "-"
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2045,
                                      "name": "oracleData",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1999,
                                      "src": "32437:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_storage",
                                        "typeString": "bytes storage ref"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes_storage",
                                        "typeString": "bytes storage ref"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2043,
                                      "name": "oracle",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1997,
                                      "src": "32423:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IOracle_$1841",
                                        "typeString": "contract IOracle"
                                      }
                                    },
                                    "id": 2044,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "symbol",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1832,
                                    "src": "32423:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$_t_bytes_memory_ptr_$returns$_t_string_memory_ptr_$",
                                      "typeString": "function (bytes memory) view external returns (string memory)"
                                    }
                                  },
                                  "id": 2046,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "32423:25:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_dbfa5bef228160978b860ed675aab7f09ac4fbd629b3686f074f60d7f70aa633",
                                    "typeString": "literal_string \"km\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_fba9715e477e68952d3f1df7a185b3708aadad50ec10cc793973864023868527",
                                    "typeString": "literal_string \"/\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561",
                                    "typeString": "literal_string \"-\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2032,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "32345:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 2033,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodePacked",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "32345:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 2047,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32345:104:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 2031,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "32338:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                              "typeString": "type(string storage pointer)"
                            },
                            "typeName": {
                              "id": 2030,
                              "name": "string",
                              "nodeType": "ElementaryTypeName",
                              "src": "32338:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2048,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32338:112:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 2029,
                        "id": 2049,
                        "nodeType": "Return",
                        "src": "32331:119:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "95d89b41",
                  "id": 2051,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "symbol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2026,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32280:2:0"
                  },
                  "returnParameters": {
                    "id": 2029,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2028,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2051,
                        "src": "32306:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2027,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32306:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32305:15:0"
                  },
                  "scope": 4810,
                  "src": "32265:192:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2076,
                    "nodeType": "Block",
                    "src": "32517:146:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "4b61736869204d656469756d205269736b20",
                                  "id": 2060,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32558:20:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_323d6e95143278b28f89b340a54b163a98b72d0ae7b3bbb9721badfe5677fa12",
                                    "typeString": "literal_string \"Kashi Medium Risk \""
                                  },
                                  "value": "Kashi Medium Risk "
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2061,
                                      "name": "collateral",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1993,
                                      "src": "32580:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$1118",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 2062,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "safeName",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1282,
                                    "src": "32580:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$1118_$returns$_t_string_memory_ptr_$bound_to$_t_contract$_IERC20_$1118_$",
                                      "typeString": "function (contract IERC20) view returns (string memory)"
                                    }
                                  },
                                  "id": 2063,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "32580:21:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "2f",
                                  "id": 2064,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32603:3:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_fba9715e477e68952d3f1df7a185b3708aadad50ec10cc793973864023868527",
                                    "typeString": "literal_string \"/\""
                                  },
                                  "value": "/"
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2065,
                                      "name": "asset",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1995,
                                      "src": "32608:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$1118",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 2066,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "safeName",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1282,
                                    "src": "32608:14:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$1118_$returns$_t_string_memory_ptr_$bound_to$_t_contract$_IERC20_$1118_$",
                                      "typeString": "function (contract IERC20) view returns (string memory)"
                                    }
                                  },
                                  "id": 2067,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "32608:16:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "2d",
                                  "id": 2068,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32626:3:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561",
                                    "typeString": "literal_string \"-\""
                                  },
                                  "value": "-"
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2071,
                                      "name": "oracleData",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1999,
                                      "src": "32643:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_storage",
                                        "typeString": "bytes storage ref"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes_storage",
                                        "typeString": "bytes storage ref"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2069,
                                      "name": "oracle",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1997,
                                      "src": "32631:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IOracle_$1841",
                                        "typeString": "contract IOracle"
                                      }
                                    },
                                    "id": 2070,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "name",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1840,
                                    "src": "32631:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$_t_bytes_memory_ptr_$returns$_t_string_memory_ptr_$",
                                      "typeString": "function (bytes memory) view external returns (string memory)"
                                    }
                                  },
                                  "id": 2072,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "32631:23:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_323d6e95143278b28f89b340a54b163a98b72d0ae7b3bbb9721badfe5677fa12",
                                    "typeString": "literal_string \"Kashi Medium Risk \""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_fba9715e477e68952d3f1df7a185b3708aadad50ec10cc793973864023868527",
                                    "typeString": "literal_string \"/\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_d3b8281179950f98149eefdb158d0e1acb56f56e8e343aa9fefafa7e36959561",
                                    "typeString": "literal_string \"-\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2058,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "32541:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 2059,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodePacked",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "32541:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 2073,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32541:114:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 2057,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "32534:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                              "typeString": "type(string storage pointer)"
                            },
                            "typeName": {
                              "id": 2056,
                              "name": "string",
                              "nodeType": "ElementaryTypeName",
                              "src": "32534:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2074,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32534:122:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 2055,
                        "id": 2075,
                        "nodeType": "Return",
                        "src": "32527:129:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "06fdde03",
                  "id": 2077,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "name",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2052,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32476:2:0"
                  },
                  "returnParameters": {
                    "id": 2055,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2054,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2077,
                        "src": "32502:13:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2053,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32502:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32501:15:0"
                  },
                  "scope": 4810,
                  "src": "32463:200:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2086,
                    "nodeType": "Block",
                    "src": "32719:44:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2082,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1995,
                              "src": "32736:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 2083,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeDecimals",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1322,
                            "src": "32736:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$1118_$returns$_t_uint8_$bound_to$_t_contract$_IERC20_$1118_$",
                              "typeString": "function (contract IERC20) view returns (uint8)"
                            }
                          },
                          "id": 2084,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32736:20:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 2081,
                        "id": 2085,
                        "nodeType": "Return",
                        "src": "32729:27:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "313ce567",
                  "id": 2087,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "decimals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2078,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32686:2:0"
                  },
                  "returnParameters": {
                    "id": 2081,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2080,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2087,
                        "src": "32712:5:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 2079,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "32712:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32711:7:0"
                  },
                  "scope": 4810,
                  "src": "32669:94:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2095,
                    "nodeType": "Block",
                    "src": "32865:39:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2092,
                            "name": "totalAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2003,
                            "src": "32882:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "id": 2093,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "base",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 752,
                          "src": "32882:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "functionReturnParameters": 2091,
                        "id": 2094,
                        "nodeType": "Return",
                        "src": "32875:22:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "18160ddd",
                  "id": 2096,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2088,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32832:2:0"
                  },
                  "returnParameters": {
                    "id": 2091,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2090,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2096,
                        "src": "32856:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2089,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32856:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32855:9:0"
                  },
                  "scope": 4810,
                  "src": "32812:92:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "id": 2099,
                  "mutability": "constant",
                  "name": "CLOSED_COLLATERIZATION_RATE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "32956:60:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2097,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "32956:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3735303030",
                    "id": 2098,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33011:5:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_75000_by_1",
                      "typeString": "int_const 75000"
                    },
                    "value": "75000"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2102,
                  "mutability": "constant",
                  "name": "OPEN_COLLATERIZATION_RATE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33029:58:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2100,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33029:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3737303030",
                    "id": 2101,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33082:5:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_77000_by_1",
                      "typeString": "int_const 77000"
                    },
                    "value": "77000"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2105,
                  "mutability": "constant",
                  "name": "COLLATERIZATION_RATE_PRECISION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33100:61:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2103,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33100:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "316535",
                    "id": 2104,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33158:3:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_100000_by_1",
                      "typeString": "int_const 100000"
                    },
                    "value": "1e5"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2108,
                  "mutability": "constant",
                  "name": "MINIMUM_TARGET_UTILIZATION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33242:58:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2106,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33242:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "37653137",
                    "id": 2107,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33296:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_700000000000000000_by_1",
                      "typeString": "int_const 700000000000000000"
                    },
                    "value": "7e17"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2111,
                  "mutability": "constant",
                  "name": "MAXIMUM_TARGET_UTILIZATION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33313:58:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2109,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33313:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "38653137",
                    "id": 2110,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33367:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_800000000000000000_by_1",
                      "typeString": "int_const 800000000000000000"
                    },
                    "value": "8e17"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2114,
                  "mutability": "constant",
                  "name": "UTILIZATION_PRECISION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33384:53:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2112,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33384:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31653138",
                    "id": 2113,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33433:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1000000000000000000_by_1",
                      "typeString": "int_const 1000000000000000000"
                    },
                    "value": "1e18"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2117,
                  "mutability": "constant",
                  "name": "FULL_UTILIZATION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33443:48:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2115,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33443:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31653138",
                    "id": 2116,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33487:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1000000000000000000_by_1",
                      "typeString": "int_const 1000000000000000000"
                    },
                    "value": "1e18"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2122,
                  "mutability": "constant",
                  "name": "FULL_UTILIZATION_MINUS_MAX",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33497:99:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2118,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33497:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2121,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 2119,
                      "name": "FULL_UTILIZATION",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2117,
                      "src": "33551:16:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 2120,
                      "name": "MAXIMUM_TARGET_UTILIZATION",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2111,
                      "src": "33570:26:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "33551:45:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2125,
                  "mutability": "constant",
                  "name": "FACTOR_PRECISION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33602:48:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2123,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33602:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31653138",
                    "id": 2124,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33646:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1000000000000000000_by_1",
                      "typeString": "int_const 1000000000000000000"
                    },
                    "value": "1e18"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2128,
                  "mutability": "constant",
                  "name": "STARTING_INTEREST_PER_SECOND",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33657:64:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 2126,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "33657:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "333137303937393230",
                    "id": 2127,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33712:9:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_317097920_by_1",
                      "typeString": "int_const 317097920"
                    },
                    "value": "317097920"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2131,
                  "mutability": "constant",
                  "name": "MINIMUM_INTEREST_PER_SECOND",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33744:62:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 2129,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "33744:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3739323734343830",
                    "id": 2130,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33798:8:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_79274480_by_1",
                      "typeString": "int_const 79274480"
                    },
                    "value": "79274480"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2134,
                  "mutability": "constant",
                  "name": "MAXIMUM_INTEREST_PER_SECOND",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33832:66:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 2132,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "33832:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "333137303937393230303030",
                    "id": 2133,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33886:12:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_317097920000_by_1",
                      "typeString": "int_const 317097920000"
                    },
                    "value": "317097920000"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2137,
                  "mutability": "constant",
                  "name": "INTEREST_ELASTICITY",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "33924:55:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2135,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33924:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3238383030653336",
                    "id": 2136,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "33971:8:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_28800000000000000000000000000000000000000_by_1",
                      "typeString": "int_const 2880...(33 digits omitted)...0000"
                    },
                    "value": "28800e36"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2140,
                  "mutability": "constant",
                  "name": "EXCHANGE_RATE_PRECISION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "34041:55:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2138,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34041:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31653138",
                    "id": 2139,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "34092:4:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1000000000000000000_by_1",
                      "typeString": "int_const 1000000000000000000"
                    },
                    "value": "1e18"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2143,
                  "mutability": "constant",
                  "name": "LIQUIDATION_MULTIPLIER",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "34103:56:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2141,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34103:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "313132303030",
                    "id": 2142,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "34153:6:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_112000_by_1",
                      "typeString": "int_const 112000"
                    },
                    "value": "112000"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2146,
                  "mutability": "constant",
                  "name": "LIQUIDATION_MULTIPLIER_PRECISION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "34176:63:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2144,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34176:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "316535",
                    "id": 2145,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "34236:3:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_100000_by_1",
                      "typeString": "int_const 100000"
                    },
                    "value": "1e5"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2149,
                  "mutability": "constant",
                  "name": "PROTOCOL_FEE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "34258:45:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2147,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34258:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3130303030",
                    "id": 2148,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "34298:5:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_10000_by_1",
                      "typeString": "int_const 10000"
                    },
                    "value": "10000"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2152,
                  "mutability": "constant",
                  "name": "PROTOCOL_FEE_DIVISOR",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "34316:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2150,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34316:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "316535",
                    "id": 2151,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "34364:3:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_100000_by_1",
                      "typeString": "int_const 100000"
                    },
                    "value": "1e5"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2155,
                  "mutability": "constant",
                  "name": "BORROW_OPENING_FEE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "34373:48:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2153,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34373:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3530",
                    "id": 2154,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "34419:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_50_by_1",
                      "typeString": "int_const 50"
                    },
                    "value": "50"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2158,
                  "mutability": "constant",
                  "name": "BORROW_OPENING_FEE_PRECISION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "34436:59:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2156,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34436:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "316535",
                    "id": 2157,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "34492:3:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_100000_by_1",
                      "typeString": "int_const 100000"
                    },
                    "value": "1e5"
                  },
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 2177,
                    "nodeType": "Block",
                    "src": "34668:96:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2166,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2164,
                            "name": "bentoBox",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1983,
                            "src": "34678:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                              "typeString": "contract IBentoBoxV1"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2165,
                            "name": "bentoBox_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2161,
                            "src": "34689:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                              "typeString": "contract IBentoBoxV1"
                            }
                          },
                          "src": "34678:20:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                            "typeString": "contract IBentoBoxV1"
                          }
                        },
                        "id": 2167,
                        "nodeType": "ExpressionStatement",
                        "src": "34678:20:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2170,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2168,
                            "name": "masterContract",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1985,
                            "src": "34708:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                              "typeString": "contract KashiPairMediumRiskV1"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2169,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "34725:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                              "typeString": "contract KashiPairMediumRiskV1"
                            }
                          },
                          "src": "34708:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                            "typeString": "contract KashiPairMediumRiskV1"
                          }
                        },
                        "id": 2171,
                        "nodeType": "ExpressionStatement",
                        "src": "34708:21:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2175,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2172,
                            "name": "feeTo",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1987,
                            "src": "34739:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2173,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "34747:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 2174,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "34747:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "34739:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 2176,
                        "nodeType": "ExpressionStatement",
                        "src": "34739:18:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2159,
                    "nodeType": "StructuredDocumentation",
                    "src": "34502:119:0",
                    "text": "@notice The constructor is only used for the initial master contract. Subsequent clones are initialised via `init`."
                  },
                  "id": 2178,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2162,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2161,
                        "mutability": "mutable",
                        "name": "bentoBox_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2178,
                        "src": "34638:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                          "typeString": "contract IBentoBoxV1"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2160,
                          "name": "IBentoBoxV1",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1796,
                          "src": "34638:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                            "typeString": "contract IBentoBoxV1"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34637:23:0"
                  },
                  "returnParameters": {
                    "id": 2163,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34668:0:0"
                  },
                  "scope": 4810,
                  "src": "34626:138:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    747
                  ],
                  "body": {
                    "id": 2237,
                    "nodeType": "Block",
                    "src": "35044:380:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2194,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2188,
                                    "name": "collateral",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1993,
                                    "src": "35070:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  ],
                                  "id": 2187,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "35062:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2186,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "35062:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2189,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35062:19:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2192,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "35093: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": 2191,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "35085:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2190,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "35085:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2193,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35085:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "35062:33:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b61736869506169723a20616c726561647920696e697469616c697a6564",
                              "id": 2195,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "35097:32:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_11558ad8521cd1eaac9870bc3a25ee18f5c40ebbb1f6f6b4270eace14c837394",
                                "typeString": "literal_string \"KashiPair: already initialized\""
                              },
                              "value": "KashiPair: already initialized"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_11558ad8521cd1eaac9870bc3a25ee18f5c40ebbb1f6f6b4270eace14c837394",
                                "typeString": "literal_string \"KashiPair: already initialized\""
                              }
                            ],
                            "id": 2185,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "35054:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2196,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35054:76:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2197,
                        "nodeType": "ExpressionStatement",
                        "src": "35054:76:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2213,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "id": 2198,
                                "name": "collateral",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1993,
                                "src": "35141:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 2199,
                                "name": "asset",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1995,
                                "src": "35153:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 2200,
                                "name": "oracle",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1997,
                                "src": "35160:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IOracle_$1841",
                                  "typeString": "contract IOracle"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 2201,
                                "name": "oracleData",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1999,
                                "src": "35168:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_storage",
                                  "typeString": "bytes storage ref"
                                }
                              }
                            ],
                            "id": 2202,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "TupleExpression",
                            "src": "35140:39:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_contract$_IERC20_$1118_$_t_contract$_IERC20_$1118_$_t_contract$_IOracle_$1841_$_t_bytes_storage_$",
                              "typeString": "tuple(contract IERC20,contract IERC20,contract IOracle,bytes storage ref)"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2205,
                                "name": "data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2181,
                                "src": "35193:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                  "typeString": "bytes calldata"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2206,
                                    "name": "IERC20",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1118,
                                    "src": "35200:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IERC20_$1118_$",
                                      "typeString": "type(contract IERC20)"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2207,
                                    "name": "IERC20",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1118,
                                    "src": "35208:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IERC20_$1118_$",
                                      "typeString": "type(contract IERC20)"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2208,
                                    "name": "IOracle",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1841,
                                    "src": "35216:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IOracle_$1841_$",
                                      "typeString": "type(contract IOracle)"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2210,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "35225:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                      "typeString": "type(bytes storage pointer)"
                                    },
                                    "typeName": {
                                      "id": 2209,
                                      "name": "bytes",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "35225:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  }
                                ],
                                "id": 2211,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "35199:32:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_contract$_IOracle_$1841_$_$_t_type$_t_bytes_storage_ptr_$_$",
                                  "typeString": "tuple(type(contract IERC20),type(contract IERC20),type(contract IOracle),type(bytes storage pointer))"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                  "typeString": "bytes calldata"
                                },
                                {
                                  "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_contract$_IOracle_$1841_$_$_t_type$_t_bytes_storage_ptr_$_$",
                                  "typeString": "tuple(type(contract IERC20),type(contract IERC20),type(contract IOracle),type(bytes storage pointer))"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2203,
                                "name": "abi",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -1,
                                "src": "35182:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_abi",
                                  "typeString": "abi"
                                }
                              },
                              "id": 2204,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "decode",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "35182:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                "typeString": "function () pure"
                              }
                            },
                            "id": 2212,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35182:50:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_contract$_IERC20_$1118_$_t_contract$_IERC20_$1118_$_t_contract$_IOracle_$1841_$_t_bytes_memory_ptr_$",
                              "typeString": "tuple(contract IERC20,contract IERC20,contract IOracle,bytes memory)"
                            }
                          },
                          "src": "35140:92:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2214,
                        "nodeType": "ExpressionStatement",
                        "src": "35140:92:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2224,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2218,
                                    "name": "collateral",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1993,
                                    "src": "35258:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  ],
                                  "id": 2217,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "35250:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2216,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "35250:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2219,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35250:19:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2222,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "35281: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": 2221,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "35273:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2220,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "35273:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2223,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35273:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "35250:33:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b61736869506169723a206261642070616972",
                              "id": 2225,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "35285:21:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_7f2b70e2a166e588fa25fa015c386d19d2948d306fd93a5dcd946db0787d96a9",
                                "typeString": "literal_string \"KashiPair: bad pair\""
                              },
                              "value": "KashiPair: bad pair"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_7f2b70e2a166e588fa25fa015c386d19d2948d306fd93a5dcd946db0787d96a9",
                                "typeString": "literal_string \"KashiPair: bad pair\""
                              }
                            ],
                            "id": 2215,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "35242:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2226,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35242:65:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2227,
                        "nodeType": "ExpressionStatement",
                        "src": "35242:65:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2235,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2228,
                              "name": "accrueInfo",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2025,
                              "src": "35318:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                                "typeString": "struct KashiPairMediumRiskV1.AccrueInfo storage ref"
                              }
                            },
                            "id": 2230,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "interestPerSecond",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2018,
                            "src": "35318:28:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2233,
                                "name": "STARTING_INTEREST_PER_SECOND",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2128,
                                "src": "35356:28:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              ],
                              "id": 2232,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "35349:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 2231,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "35349:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 2234,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35349:36:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "src": "35318:67:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "id": 2236,
                        "nodeType": "ExpressionStatement",
                        "src": "35318:67:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2179,
                    "nodeType": "StructuredDocumentation",
                    "src": "34770:210:0",
                    "text": "@notice Serves as the constructor for clones, as clones can't have a regular constructor\n @dev `data` is abi encoded in the format: (IERC20 collateral, IERC20 asset, IOracle oracle, bytes oracleData)"
                  },
                  "functionSelector": "4ddf47d4",
                  "id": 2238,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "init",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2183,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "35035:8:0"
                  },
                  "parameters": {
                    "id": 2182,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2181,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2238,
                        "src": "34999:19:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2180,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "34999:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34998:21:0"
                  },
                  "returnParameters": {
                    "id": 2184,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35044:0:0"
                  },
                  "scope": 4810,
                  "src": "34985:439:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2552,
                    "nodeType": "Block",
                    "src": "35553:3145:0",
                    "statements": [
                      {
                        "assignments": [
                          2243
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2243,
                            "mutability": "mutable",
                            "name": "_accrueInfo",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "35563:29:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                              "typeString": "struct KashiPairMediumRiskV1.AccrueInfo"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2242,
                              "name": "AccrueInfo",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 2023,
                              "src": "35563:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage_ptr",
                                "typeString": "struct KashiPairMediumRiskV1.AccrueInfo"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2245,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 2244,
                          "name": "accrueInfo",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2025,
                          "src": "35595:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                            "typeString": "struct KashiPairMediumRiskV1.AccrueInfo storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "35563:42:0"
                      },
                      {
                        "assignments": [
                          2247
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2247,
                            "mutability": "mutable",
                            "name": "elapsedTime",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "35668:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2246,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "35668:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2253,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2252,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2248,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "35690:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2249,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "timestamp",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "35690:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2250,
                              "name": "_accrueInfo",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2243,
                              "src": "35708:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                              }
                            },
                            "id": 2251,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "lastAccrued",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2020,
                            "src": "35708:23:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "src": "35690:41:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "35668:63:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2256,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2254,
                            "name": "elapsedTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2247,
                            "src": "35745:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2255,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "35760:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "35745:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2259,
                        "nodeType": "IfStatement",
                        "src": "35741:53:0",
                        "trueBody": {
                          "id": 2258,
                          "nodeType": "Block",
                          "src": "35763:31:0",
                          "statements": [
                            {
                              "expression": null,
                              "functionReturnParameters": 2241,
                              "id": 2257,
                              "nodeType": "Return",
                              "src": "35777:7:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2268,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2260,
                              "name": "_accrueInfo",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2243,
                              "src": "35803:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                              }
                            },
                            "id": 2262,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "lastAccrued",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2020,
                            "src": "35803:23:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2265,
                                  "name": "block",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -4,
                                  "src": "35836:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_block",
                                    "typeString": "block"
                                  }
                                },
                                "id": 2266,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "timestamp",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "35836:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 2264,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "35829:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 2263,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "35829:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 2267,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35829:23:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          "src": "35803:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "id": 2269,
                        "nodeType": "ExpressionStatement",
                        "src": "35803:49:0"
                      },
                      {
                        "assignments": [
                          2271
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2271,
                            "mutability": "mutable",
                            "name": "_totalBorrow",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "35863:26:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2270,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 753,
                              "src": "35863:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2273,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 2272,
                          "name": "totalBorrow",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2005,
                          "src": "35892:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "35863:40:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 2277,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2274,
                              "name": "_totalBorrow",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2271,
                              "src": "35917:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 2275,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "35917:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2276,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "35938:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "35917:22:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2303,
                        "nodeType": "IfStatement",
                        "src": "35913:405:0",
                        "trueBody": {
                          "id": 2302,
                          "nodeType": "Block",
                          "src": "35941:377:0",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                },
                                "id": 2281,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2278,
                                    "name": "_accrueInfo",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2243,
                                    "src": "36023:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                      "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                    }
                                  },
                                  "id": 2279,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "interestPerSecond",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 2018,
                                  "src": "36023:29:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2280,
                                  "name": "STARTING_INTEREST_PER_SECOND",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2128,
                                  "src": "36056:28:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "src": "36023:61:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 2296,
                              "nodeType": "IfStatement",
                              "src": "36019:231:0",
                              "trueBody": {
                                "id": 2295,
                                "nodeType": "Block",
                                "src": "36086:164:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2286,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2282,
                                          "name": "_accrueInfo",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2243,
                                          "src": "36104:11:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                            "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                          }
                                        },
                                        "id": 2284,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "memberName": "interestPerSecond",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 2018,
                                        "src": "36104:29:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 2285,
                                        "name": "STARTING_INTEREST_PER_SECOND",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2128,
                                        "src": "36136:28:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "src": "36104:60:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "id": 2287,
                                    "nodeType": "ExpressionStatement",
                                    "src": "36104:60:0"
                                  },
                                  {
                                    "eventCall": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 2289,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "36197:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 2290,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "36200:1:0",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 2291,
                                          "name": "STARTING_INTEREST_PER_SECOND",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2128,
                                          "src": "36203:28:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint64",
                                            "typeString": "uint64"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 2292,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "36233: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"
                                          },
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          {
                                            "typeIdentifier": "t_uint64",
                                            "typeString": "uint64"
                                          },
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          }
                                        ],
                                        "id": 2288,
                                        "name": "LogAccrue",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1913,
                                        "src": "36187:9:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$_t_uint64_$_t_uint256_$returns$__$",
                                          "typeString": "function (uint256,uint256,uint64,uint256)"
                                        }
                                      },
                                      "id": 2293,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "36187:48:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 2294,
                                    "nodeType": "EmitStatement",
                                    "src": "36182:53:0"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2299,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2297,
                                  "name": "accrueInfo",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2025,
                                  "src": "36263:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                                    "typeString": "struct KashiPairMediumRiskV1.AccrueInfo storage ref"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2298,
                                  "name": "_accrueInfo",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2243,
                                  "src": "36276:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                    "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                  }
                                },
                                "src": "36263:24:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                                  "typeString": "struct KashiPairMediumRiskV1.AccrueInfo storage ref"
                                }
                              },
                              "id": 2300,
                              "nodeType": "ExpressionStatement",
                              "src": "36263:24:0"
                            },
                            {
                              "expression": null,
                              "functionReturnParameters": 2241,
                              "id": 2301,
                              "nodeType": "Return",
                              "src": "36301:7:0"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          2305
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2305,
                            "mutability": "mutable",
                            "name": "extraAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "36328:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2304,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "36328:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2307,
                        "initialValue": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 2306,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "36350:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "36328:23:0"
                      },
                      {
                        "assignments": [
                          2309
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2309,
                            "mutability": "mutable",
                            "name": "feeFraction",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "36361:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2308,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "36361:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2311,
                        "initialValue": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 2310,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "36383:1:0",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "36361:23:0"
                      },
                      {
                        "assignments": [
                          2313
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2313,
                            "mutability": "mutable",
                            "name": "_totalAsset",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "36394:25:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2312,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 753,
                              "src": "36394:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2315,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 2314,
                          "name": "totalAsset",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2003,
                          "src": "36422:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "36394:38:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2331,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2316,
                            "name": "extraAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2305,
                            "src": "36470:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2330,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2327,
                                  "name": "elapsedTime",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2247,
                                  "src": "36553:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2323,
                                        "name": "_accrueInfo",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2243,
                                        "src": "36518:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                          "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                        }
                                      },
                                      "id": 2324,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "interestPerSecond",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 2018,
                                      "src": "36518:29:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2319,
                                            "name": "_totalBorrow",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2271,
                                            "src": "36492:12:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                              "typeString": "struct Rebase memory"
                                            }
                                          },
                                          "id": 2320,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "elastic",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 750,
                                          "src": "36492:20:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint128",
                                            "typeString": "uint128"
                                          }
                                        ],
                                        "id": 2318,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "36484:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint256_$",
                                          "typeString": "type(uint256)"
                                        },
                                        "typeName": {
                                          "id": 2317,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "36484:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 2321,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "36484:29:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2322,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 75,
                                    "src": "36484:33: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": 2325,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "36484:64:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2326,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "mul",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 75,
                                "src": "36484:68: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": 2328,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36484:81:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "31653138",
                              "id": 2329,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "36568:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                "typeString": "int_const 1000000000000000000"
                              },
                              "value": "1e18"
                            },
                            "src": "36484:88:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36470:102:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2332,
                        "nodeType": "ExpressionStatement",
                        "src": "36470:102:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2343,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2333,
                              "name": "_totalBorrow",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2271,
                              "src": "36582:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 2335,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "36582:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2339,
                                    "name": "extraAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2305,
                                    "src": "36630:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2340,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "36630:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2341,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "36630:19:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2336,
                                  "name": "_totalBorrow",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2271,
                                  "src": "36605:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 2337,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "36605:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2338,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "36605:24: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": 2342,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "36605:45:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "36582:68:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2344,
                        "nodeType": "ExpressionStatement",
                        "src": "36582:68:0"
                      },
                      {
                        "assignments": [
                          2346
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2346,
                            "mutability": "mutable",
                            "name": "fullAssetAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "36660:23:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2345,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "36660:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2358,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2355,
                                "name": "_totalBorrow",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2271,
                                "src": "36743:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              "id": 2356,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "elastic",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 750,
                              "src": "36743:20:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2349,
                                  "name": "asset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1995,
                                  "src": "36704:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$1118",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2350,
                                    "name": "_totalAsset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2313,
                                    "src": "36711:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                      "typeString": "struct Rebase memory"
                                    }
                                  },
                                  "id": 2351,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 750,
                                  "src": "36711:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "66616c7365",
                                  "id": 2352,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "bool",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "36732:5:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "value": "false"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$1118",
                                    "typeString": "contract IERC20"
                                  },
                                  {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2347,
                                  "name": "bentoBox",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1983,
                                  "src": "36686:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                    "typeString": "contract IBentoBoxV1"
                                  }
                                },
                                "id": 2348,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toAmount",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1713,
                                "src": "36686:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                  "typeString": "function (contract IERC20,uint256,bool) view external returns (uint256)"
                                }
                              },
                              "id": 2353,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36686:52:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2354,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25,
                            "src": "36686:56: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": 2357,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36686:78:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "36660:104:0"
                      },
                      {
                        "assignments": [
                          2360
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2360,
                            "mutability": "mutable",
                            "name": "feeAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "36775:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2359,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "36775:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2367,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2366,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2363,
                                "name": "PROTOCOL_FEE",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2149,
                                "src": "36811:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2361,
                                "name": "extraAmount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2305,
                                "src": "36795:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2362,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "mul",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 75,
                              "src": "36795: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": 2364,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "36795:29:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2365,
                            "name": "PROTOCOL_FEE_DIVISOR",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2152,
                            "src": "36827:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36795:52:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "36775:72:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2376,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2368,
                            "name": "feeFraction",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2309,
                            "src": "36891:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2375,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2371,
                                    "name": "_totalAsset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2313,
                                    "src": "36919:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                      "typeString": "struct Rebase memory"
                                    }
                                  },
                                  "id": 2372,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "base",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 752,
                                  "src": "36919:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2369,
                                  "name": "feeAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2360,
                                  "src": "36905:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2370,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "mul",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 75,
                                "src": "36905:13: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": 2373,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36905:31:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2374,
                              "name": "fullAssetAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2346,
                              "src": "36939:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "36905:49:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36891:63:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2377,
                        "nodeType": "ExpressionStatement",
                        "src": "36891:63:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2388,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2378,
                              "name": "_accrueInfo",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2243,
                              "src": "36964:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                              }
                            },
                            "id": 2380,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "feesEarnedFraction",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2022,
                            "src": "36964:30:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2384,
                                    "name": "feeFraction",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2309,
                                    "src": "37032:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2385,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "37032:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2386,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37032:19:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2381,
                                  "name": "_accrueInfo",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2243,
                                  "src": "36997:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                    "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                  }
                                },
                                "id": 2382,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "feesEarnedFraction",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 2022,
                                "src": "36997:30:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2383,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "36997:34: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": 2387,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "36997:55:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "36964:88:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2389,
                        "nodeType": "ExpressionStatement",
                        "src": "36964:88:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2400,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2390,
                              "name": "totalAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2003,
                              "src": "37062:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                "typeString": "struct Rebase storage ref"
                              }
                            },
                            "id": 2392,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "37062:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2396,
                                    "name": "feeFraction",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2309,
                                    "src": "37101:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2397,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "37101:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2398,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37101:19:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2393,
                                  "name": "_totalAsset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2313,
                                  "src": "37080:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 2394,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "37080:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2395,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "37080:20: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": 2399,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37080:41:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "37062:59:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 2401,
                        "nodeType": "ExpressionStatement",
                        "src": "37062:59:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2404,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2402,
                            "name": "totalBorrow",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2005,
                            "src": "37131:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2403,
                            "name": "_totalBorrow",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2271,
                            "src": "37145:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "37131:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 2405,
                        "nodeType": "ExpressionStatement",
                        "src": "37131:26:0"
                      },
                      {
                        "assignments": [
                          2407
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2407,
                            "mutability": "mutable",
                            "name": "utilization",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2552,
                            "src": "37200:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2406,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "37200:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2418,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2417,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2414,
                                "name": "UTILIZATION_PRECISION",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2114,
                                "src": "37256:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2410,
                                      "name": "_totalBorrow",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2271,
                                      "src": "37230:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 2411,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "elastic",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 750,
                                    "src": "37230:20:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  ],
                                  "id": 2409,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "37222:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint256_$",
                                    "typeString": "type(uint256)"
                                  },
                                  "typeName": {
                                    "id": 2408,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "37222:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2412,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37222:29:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2413,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "mul",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 75,
                              "src": "37222:33: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": 2415,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37222:56:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2416,
                            "name": "fullAssetAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2346,
                            "src": "37281:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "37222:74:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "37200:96:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2421,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2419,
                            "name": "utilization",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2407,
                            "src": "37310:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2420,
                            "name": "MINIMUM_TARGET_UTILIZATION",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2108,
                            "src": "37324:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "37310:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2480,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2478,
                              "name": "utilization",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2407,
                              "src": "37920:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2479,
                              "name": "MAXIMUM_TARGET_UTILIZATION",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2111,
                              "src": "37934:26:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "37920:40:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": null,
                          "id": 2538,
                          "nodeType": "IfStatement",
                          "src": "37916:647:0",
                          "trueBody": {
                            "id": 2537,
                            "nodeType": "Block",
                            "src": "37962:601:0",
                            "statements": [
                              {
                                "assignments": [
                                  2482
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2482,
                                    "mutability": "mutable",
                                    "name": "overFactor",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2537,
                                    "src": "37976:18:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2481,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "37976:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2492,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2491,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2488,
                                        "name": "FACTOR_PRECISION",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2125,
                                        "src": "38045:16:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 2485,
                                            "name": "MAXIMUM_TARGET_UTILIZATION",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2111,
                                            "src": "38013:26:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2483,
                                            "name": "utilization",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2407,
                                            "src": "37997:11:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 2484,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "sub",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 47,
                                          "src": "37997: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": 2486,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "37997:43:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2487,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 75,
                                      "src": "37997:47: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": 2489,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "37997:65:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2490,
                                    "name": "FULL_UTILIZATION_MINUS_MAX",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2122,
                                    "src": "38065:26:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "37997:94:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "37976:115:0"
                              },
                              {
                                "assignments": [
                                  2494
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2494,
                                    "mutability": "mutable",
                                    "name": "scale",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2537,
                                    "src": "38105:13:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2493,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "38105:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2505,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2502,
                                          "name": "elapsedTime",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2247,
                                          "src": "38176:11:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 2499,
                                              "name": "overFactor",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2482,
                                              "src": "38160:10:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 2497,
                                              "name": "overFactor",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2482,
                                              "src": "38145:10:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 2498,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "mul",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 75,
                                            "src": "38145:14: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": 2500,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "38145:26:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 2501,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "mul",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 75,
                                        "src": "38145:30: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": 2503,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "38145:43:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2495,
                                      "name": "INTEREST_ELASTICITY",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2137,
                                      "src": "38121:19:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2496,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 25,
                                    "src": "38121:23: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": 2504,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "38121:68:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "38105:84:0"
                              },
                              {
                                "assignments": [
                                  2507
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2507,
                                    "mutability": "mutable",
                                    "name": "newInterestPerSecond",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2537,
                                    "src": "38203:28:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2506,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "38203:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2518,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2517,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2514,
                                        "name": "scale",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2494,
                                        "src": "38277:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 2510,
                                              "name": "_accrueInfo",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2243,
                                              "src": "38242:11:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                                "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                              }
                                            },
                                            "id": 2511,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "interestPerSecond",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 2018,
                                            "src": "38242:29:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint64",
                                              "typeString": "uint64"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint64",
                                              "typeString": "uint64"
                                            }
                                          ],
                                          "id": 2509,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "38234:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_uint256_$",
                                            "typeString": "type(uint256)"
                                          },
                                          "typeName": {
                                            "id": 2508,
                                            "name": "uint256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "38234:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 2512,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "38234:38:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2513,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 75,
                                      "src": "38234:42: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": 2515,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "38234:49:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2516,
                                    "name": "INTEREST_ELASTICITY",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2137,
                                    "src": "38286:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "38234:71:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "38203:102:0"
                              },
                              {
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2521,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 2519,
                                    "name": "newInterestPerSecond",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2507,
                                    "src": "38323:20:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": ">",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2520,
                                    "name": "MAXIMUM_INTEREST_PER_SECOND",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2134,
                                    "src": "38346:27:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint64",
                                      "typeString": "uint64"
                                    }
                                  },
                                  "src": "38323:50:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseBody": null,
                                "id": 2527,
                                "nodeType": "IfStatement",
                                "src": "38319:160:0",
                                "trueBody": {
                                  "id": 2526,
                                  "nodeType": "Block",
                                  "src": "38375:104:0",
                                  "statements": [
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2524,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "id": 2522,
                                          "name": "newInterestPerSecond",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2507,
                                          "src": "38393:20:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "id": 2523,
                                          "name": "MAXIMUM_INTEREST_PER_SECOND",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2134,
                                          "src": "38416:27:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint64",
                                            "typeString": "uint64"
                                          }
                                        },
                                        "src": "38393:50:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2525,
                                      "nodeType": "ExpressionStatement",
                                      "src": "38393:50:0"
                                    }
                                  ]
                                }
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2535,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2528,
                                      "name": "_accrueInfo",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2243,
                                      "src": "38492:11:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                        "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                      }
                                    },
                                    "id": 2530,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": true,
                                    "memberName": "interestPerSecond",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 2018,
                                    "src": "38492:29:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint64",
                                      "typeString": "uint64"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2533,
                                        "name": "newInterestPerSecond",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2507,
                                        "src": "38531:20:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "id": 2532,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "38524:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_uint64_$",
                                        "typeString": "type(uint64)"
                                      },
                                      "typeName": {
                                        "id": 2531,
                                        "name": "uint64",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "38524:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 2534,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "38524:28:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint64",
                                      "typeString": "uint64"
                                    }
                                  },
                                  "src": "38492:60:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "id": 2536,
                                "nodeType": "ExpressionStatement",
                                "src": "38492:60:0"
                              }
                            ]
                          }
                        },
                        "id": 2539,
                        "nodeType": "IfStatement",
                        "src": "37306:1257:0",
                        "trueBody": {
                          "id": 2477,
                          "nodeType": "Block",
                          "src": "37352:558:0",
                          "statements": [
                            {
                              "assignments": [
                                2423
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2423,
                                  "mutability": "mutable",
                                  "name": "underFactor",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2477,
                                  "src": "37366:19:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2422,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "37366:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2433,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2432,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2429,
                                      "name": "FACTOR_PRECISION",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2125,
                                      "src": "37436:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2426,
                                          "name": "utilization",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2407,
                                          "src": "37419:11:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2424,
                                          "name": "MINIMUM_TARGET_UTILIZATION",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2108,
                                          "src": "37388:26:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 2425,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sub",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 47,
                                        "src": "37388:30: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": 2427,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "37388:43:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2428,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 75,
                                    "src": "37388:47: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": 2430,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "37388:65:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "/",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2431,
                                  "name": "MINIMUM_TARGET_UTILIZATION",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2108,
                                  "src": "37456:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "37388:94:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "37366:116:0"
                            },
                            {
                              "assignments": [
                                2435
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2435,
                                  "mutability": "mutable",
                                  "name": "scale",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2477,
                                  "src": "37496:13:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2434,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "37496:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2446,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2443,
                                        "name": "elapsedTime",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2247,
                                        "src": "37569:11:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 2440,
                                            "name": "underFactor",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2423,
                                            "src": "37552:11:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 2438,
                                            "name": "underFactor",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2423,
                                            "src": "37536:11:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 2439,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "mul",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 75,
                                          "src": "37536: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": 2441,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "37536:28:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2442,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 75,
                                      "src": "37536:32: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": 2444,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "37536:45:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2436,
                                    "name": "INTEREST_ELASTICITY",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2137,
                                    "src": "37512:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2437,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "add",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 25,
                                  "src": "37512:23: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": 2445,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37512:70:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "37496:86:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2463,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2447,
                                    "name": "_accrueInfo",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2243,
                                    "src": "37596:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                      "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                    }
                                  },
                                  "id": 2449,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "interestPerSecond",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 2018,
                                  "src": "37596:29:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 2461,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 2458,
                                            "name": "INTEREST_ELASTICITY",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2137,
                                            "src": "37678:19:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 2454,
                                                  "name": "_accrueInfo",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2243,
                                                  "src": "37643:11:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                                    "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                                  }
                                                },
                                                "id": 2455,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "interestPerSecond",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 2018,
                                                "src": "37643:29:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint64",
                                                  "typeString": "uint64"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_uint64",
                                                  "typeString": "uint64"
                                                }
                                              ],
                                              "id": 2453,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "37635:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_uint256_$",
                                                "typeString": "type(uint256)"
                                              },
                                              "typeName": {
                                                "id": 2452,
                                                "name": "uint256",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "37635:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            "id": 2456,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "37635:38:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 2457,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "mul",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 75,
                                          "src": "37635:42: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": 2459,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "37635:63:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "/",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 2460,
                                        "name": "scale",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2435,
                                        "src": "37701:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "37635:71:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 2451,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "37628:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint64_$",
                                      "typeString": "type(uint64)"
                                    },
                                    "typeName": {
                                      "id": 2450,
                                      "name": "uint64",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "37628:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2462,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "37628:79:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "src": "37596:111:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                }
                              },
                              "id": 2464,
                              "nodeType": "ExpressionStatement",
                              "src": "37596:111:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint64",
                                  "typeString": "uint64"
                                },
                                "id": 2468,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2465,
                                    "name": "_accrueInfo",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2243,
                                    "src": "37726:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                      "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                    }
                                  },
                                  "id": 2466,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "interestPerSecond",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 2018,
                                  "src": "37726:29:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2467,
                                  "name": "MINIMUM_INTEREST_PER_SECOND",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2131,
                                  "src": "37758:27:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint64",
                                    "typeString": "uint64"
                                  }
                                },
                                "src": "37726:59:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 2476,
                              "nodeType": "IfStatement",
                              "src": "37722:178:0",
                              "trueBody": {
                                "id": 2475,
                                "nodeType": "Block",
                                "src": "37787:113:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2473,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2469,
                                          "name": "_accrueInfo",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2243,
                                          "src": "37805:11:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                            "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                          }
                                        },
                                        "id": 2471,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "memberName": "interestPerSecond",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 2018,
                                        "src": "37805:29:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 2472,
                                        "name": "MINIMUM_INTEREST_PER_SECOND",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2131,
                                        "src": "37837:27:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint64",
                                          "typeString": "uint64"
                                        }
                                      },
                                      "src": "37805:59:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint64",
                                        "typeString": "uint64"
                                      }
                                    },
                                    "id": 2474,
                                    "nodeType": "ExpressionStatement",
                                    "src": "37805:59:0"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2541,
                              "name": "extraAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2305,
                              "src": "38588:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2542,
                              "name": "feeFraction",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2309,
                              "src": "38601:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2543,
                                "name": "_accrueInfo",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2243,
                                "src": "38614:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                                  "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                                }
                              },
                              "id": 2544,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "interestPerSecond",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 2018,
                              "src": "38614:29:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2545,
                              "name": "utilization",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2407,
                              "src": "38645:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint64",
                                "typeString": "uint64"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2540,
                            "name": "LogAccrue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1913,
                            "src": "38578:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$_t_uint64_$_t_uint256_$returns$__$",
                              "typeString": "function (uint256,uint256,uint64,uint256)"
                            }
                          },
                          "id": 2546,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38578:79:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2547,
                        "nodeType": "EmitStatement",
                        "src": "38573:84:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2550,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2548,
                            "name": "accrueInfo",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2025,
                            "src": "38667:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                              "typeString": "struct KashiPairMediumRiskV1.AccrueInfo storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2549,
                            "name": "_accrueInfo",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2243,
                            "src": "38680:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_AccrueInfo_$2023_memory_ptr",
                              "typeString": "struct KashiPairMediumRiskV1.AccrueInfo memory"
                            }
                          },
                          "src": "38667:24:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                            "typeString": "struct KashiPairMediumRiskV1.AccrueInfo storage ref"
                          }
                        },
                        "id": 2551,
                        "nodeType": "ExpressionStatement",
                        "src": "38667:24:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2239,
                    "nodeType": "StructuredDocumentation",
                    "src": "35430:93:0",
                    "text": "@notice Accrues the interest on the borrowed tokens and handles the accumulation of fees."
                  },
                  "functionSelector": "f8ba4cff",
                  "id": 2553,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "accrue",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2240,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35543:2:0"
                  },
                  "returnParameters": {
                    "id": 2241,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35553:0:0"
                  },
                  "scope": 4810,
                  "src": "35528:3170:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2623,
                    "nodeType": "Block",
                    "src": "39043:814:0",
                    "statements": [
                      {
                        "assignments": [
                          2566
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2566,
                            "mutability": "mutable",
                            "name": "borrowPart",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2623,
                            "src": "39102:18:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2565,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "39102:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2570,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2567,
                            "name": "userBorrowPart",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2013,
                            "src": "39123:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 2569,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2568,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2556,
                            "src": "39138:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "39123:20:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "39102:41:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2573,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2571,
                            "name": "borrowPart",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2566,
                            "src": "39157:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2572,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "39171:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "39157:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2576,
                        "nodeType": "IfStatement",
                        "src": "39153:32:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "hexValue": "74727565",
                            "id": 2574,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "bool",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "39181:4:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "value": "true"
                          },
                          "functionReturnParameters": 2564,
                          "id": 2575,
                          "nodeType": "Return",
                          "src": "39174:11:0"
                        }
                      },
                      {
                        "assignments": [
                          2578
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2578,
                            "mutability": "mutable",
                            "name": "collateralShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2623,
                            "src": "39195:23:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2577,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "39195:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2582,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2579,
                            "name": "userCollateralShare",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2009,
                            "src": "39221:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 2581,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2580,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2556,
                            "src": "39241:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "39221:25:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "39195:51:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2585,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2583,
                            "name": "collateralShare",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2578,
                            "src": "39260:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2584,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "39279:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "39260:20:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2588,
                        "nodeType": "IfStatement",
                        "src": "39256:38:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "hexValue": "66616c7365",
                            "id": 2586,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "bool",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "39289:5:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "value": "false"
                          },
                          "functionReturnParameters": 2564,
                          "id": 2587,
                          "nodeType": "Return",
                          "src": "39282:12:0"
                        }
                      },
                      {
                        "assignments": [
                          2590
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2590,
                            "mutability": "mutable",
                            "name": "_totalBorrow",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2623,
                            "src": "39305:26:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2589,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 753,
                              "src": "39305:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2592,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 2591,
                          "name": "totalBorrow",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2005,
                          "src": "39334:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "39305:40:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2621,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2595,
                                "name": "collateral",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1993,
                                "src": "39410:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "condition": {
                                      "argumentTypes": null,
                                      "id": 2603,
                                      "name": "open",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2558,
                                      "src": "39541:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseExpression": {
                                      "argumentTypes": null,
                                      "id": 2605,
                                      "name": "CLOSED_COLLATERIZATION_RATE",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2099,
                                      "src": "39576:27:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2606,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "Conditional",
                                    "src": "39541:62:0",
                                    "trueExpression": {
                                      "argumentTypes": null,
                                      "id": 2604,
                                      "name": "OPEN_COLLATERIZATION_RATE",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2102,
                                      "src": "39548:25:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 2600,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 2598,
                                          "name": "EXCHANGE_RATE_PRECISION",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2140,
                                          "src": "39458:23:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "/",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 2599,
                                          "name": "COLLATERIZATION_RATE_PRECISION",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2105,
                                          "src": "39484:30:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "39458:56:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2596,
                                        "name": "collateralShare",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2578,
                                        "src": "39438:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2597,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "mul",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 75,
                                      "src": "39438:19: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": 2601,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "39438:77:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2602,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mul",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 75,
                                  "src": "39438:81: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": 2607,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "39438:183:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 2608,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "39639:5:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2593,
                                "name": "bentoBox",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1983,
                                "src": "39375:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                  "typeString": "contract IBentoBoxV1"
                                }
                              },
                              "id": 2594,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toAmount",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1713,
                              "src": "39375:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (contract IERC20,uint256,bool) view external returns (uint256)"
                              }
                            },
                            "id": 2609,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "39375:283:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2620,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2616,
                                  "name": "_exchangeRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2560,
                                  "src": "39816:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2612,
                                        "name": "_totalBorrow",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2590,
                                        "src": "39790:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                          "typeString": "struct Rebase memory"
                                        }
                                      },
                                      "id": 2613,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "elastic",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 750,
                                      "src": "39790:20:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2610,
                                      "name": "borrowPart",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2566,
                                      "src": "39775:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2611,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 75,
                                    "src": "39775:14: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": 2614,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "39775:36:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2615,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "mul",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 75,
                                "src": "39775:40: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": 2617,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "39775:55:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2618,
                                "name": "_totalBorrow",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2590,
                                "src": "39833:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              "id": 2619,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "base",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 752,
                              "src": "39833:17:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "src": "39775:75:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39375:475:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 2564,
                        "id": 2622,
                        "nodeType": "Return",
                        "src": "39356:494:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2554,
                    "nodeType": "StructuredDocumentation",
                    "src": "38704:207:0",
                    "text": "@notice Concrete implementation of `isSolvent`. Includes a third parameter to allow caching `exchangeRate`.\n @param _exchangeRate The exchange rate. Used to cache the `exchangeRate` between calls."
                  },
                  "id": 2624,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_isSolvent",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2561,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2556,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2624,
                        "src": "38945:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2555,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38945:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2558,
                        "mutability": "mutable",
                        "name": "open",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2624,
                        "src": "38967:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2557,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "38967:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2560,
                        "mutability": "mutable",
                        "name": "_exchangeRate",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2624,
                        "src": "38986:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2559,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "38986:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "38935:78:0"
                  },
                  "returnParameters": {
                    "id": 2564,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2563,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2624,
                        "src": "39037:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2562,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "39037:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39036:6:0"
                  },
                  "scope": 4810,
                  "src": "38916:941:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2638,
                    "nodeType": "Block",
                    "src": "39989:109:0",
                    "statements": [
                      {
                        "id": 2627,
                        "nodeType": "PlaceholderStatement",
                        "src": "39999:1:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2630,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "40029:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 2631,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "40029:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "66616c7365",
                                  "id": 2632,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "bool",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40041:5:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "value": "false"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2633,
                                  "name": "exchangeRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2016,
                                  "src": "40048:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 2629,
                                "name": "_isSolvent",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2624,
                                "src": "40018:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$_t_bool_$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (address,bool,uint256) view returns (bool)"
                                }
                              },
                              "id": 2634,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40018:43:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b61736869506169723a207573657220696e736f6c76656e74",
                              "id": 2635,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "40063:27:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_96328fa1bc54bf00ff9aaae06961f863040f54ceea1d5b43b4aca6d4f3fe04f9",
                                "typeString": "literal_string \"KashiPair: user insolvent\""
                              },
                              "value": "KashiPair: user insolvent"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_96328fa1bc54bf00ff9aaae06961f863040f54ceea1d5b43b4aca6d4f3fe04f9",
                                "typeString": "literal_string \"KashiPair: user insolvent\""
                              }
                            ],
                            "id": 2628,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "40010:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2636,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40010:81:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2637,
                        "nodeType": "ExpressionStatement",
                        "src": "40010:81:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2625,
                    "nodeType": "StructuredDocumentation",
                    "src": "39863:102:0",
                    "text": "@dev Checks if the user is solvent in the closed liquidation case at the end of the function body."
                  },
                  "id": 2639,
                  "name": "solvent",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2626,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39986:2:0"
                  },
                  "src": "39970:128:0",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2672,
                    "nodeType": "Block",
                    "src": "40464:279:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2654,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "id": 2647,
                                "name": "updated",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2643,
                                "src": "40475:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 2648,
                                "name": "rate",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2645,
                                "src": "40484:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 2649,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "TupleExpression",
                            "src": "40474:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                              "typeString": "tuple(bool,uint256)"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2652,
                                "name": "oracleData",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1999,
                                "src": "40503:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_storage",
                                  "typeString": "bytes storage ref"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_storage",
                                  "typeString": "bytes storage ref"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2650,
                                "name": "oracle",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1997,
                                "src": "40492:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IOracle_$1841",
                                  "typeString": "contract IOracle"
                                }
                              },
                              "id": 2651,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "get",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1806,
                              "src": "40492:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_uint256_$",
                                "typeString": "function (bytes memory) external returns (bool,uint256)"
                              }
                            },
                            "id": 2653,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "40492:22:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                              "typeString": "tuple(bool,uint256)"
                            }
                          },
                          "src": "40474:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2655,
                        "nodeType": "ExpressionStatement",
                        "src": "40474:40:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 2656,
                          "name": "updated",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2643,
                          "src": "40529:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2670,
                          "nodeType": "Block",
                          "src": "40628:109:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2668,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2666,
                                  "name": "rate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2645,
                                  "src": "40707:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2667,
                                  "name": "exchangeRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2016,
                                  "src": "40714:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "40707:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2669,
                              "nodeType": "ExpressionStatement",
                              "src": "40707:19:0"
                            }
                          ]
                        },
                        "id": 2671,
                        "nodeType": "IfStatement",
                        "src": "40525:212:0",
                        "trueBody": {
                          "id": 2665,
                          "nodeType": "Block",
                          "src": "40538:84:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2659,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2657,
                                  "name": "exchangeRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2016,
                                  "src": "40552:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2658,
                                  "name": "rate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2645,
                                  "src": "40567:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "40552:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2660,
                              "nodeType": "ExpressionStatement",
                              "src": "40552:19:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2662,
                                    "name": "rate",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2645,
                                    "src": "40606:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2661,
                                  "name": "LogExchangeRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1903,
                                  "src": "40590:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256)"
                                  }
                                },
                                "id": 2663,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "40590:21:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2664,
                              "nodeType": "EmitStatement",
                              "src": "40585:26:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2640,
                    "nodeType": "StructuredDocumentation",
                    "src": "40104:281:0",
                    "text": "@notice Gets the exchange rate. I.e how much collateral to buy 1e18 asset.\n This function is supposed to be invoked if needed because Oracle queries can be expensive.\n @return updated True if `exchangeRate` was updated.\n @return rate The new exchange rate."
                  },
                  "functionSelector": "02ce728f",
                  "id": 2673,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "updateExchangeRate",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2641,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40417:2:0"
                  },
                  "returnParameters": {
                    "id": 2646,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2643,
                        "mutability": "mutable",
                        "name": "updated",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2673,
                        "src": "40436:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2642,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40436:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2645,
                        "mutability": "mutable",
                        "name": "rate",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2673,
                        "src": "40450:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2644,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "40450:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40435:28:0"
                  },
                  "scope": 4810,
                  "src": "40390:353:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2719,
                    "nodeType": "Block",
                    "src": "41311:237:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 2685,
                          "name": "skim",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2682,
                          "src": "41325:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2717,
                          "nodeType": "Block",
                          "src": "41459:83:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2707,
                                    "name": "token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2676,
                                    "src": "41491:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2708,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "41498:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2709,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "41498:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2712,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "41518:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      ],
                                      "id": 2711,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "41510:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 2710,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "41510:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 2713,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "41510:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2714,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2678,
                                    "src": "41525:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2704,
                                    "name": "bentoBox",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1983,
                                    "src": "41473:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  },
                                  "id": 2706,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "transfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1742,
                                  "src": "41473:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,address,address,uint256) external"
                                  }
                                },
                                "id": 2715,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "41473:58:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2716,
                              "nodeType": "ExpressionStatement",
                              "src": "41473:58:0"
                            }
                          ]
                        },
                        "id": 2718,
                        "nodeType": "IfStatement",
                        "src": "41321:221:0",
                        "trueBody": {
                          "id": 2703,
                          "nodeType": "Block",
                          "src": "41331:122:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2699,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 2687,
                                      "name": "share",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2678,
                                      "src": "41353:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "<=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2697,
                                          "name": "total",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2680,
                                          "src": "41407:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 2690,
                                              "name": "token",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2676,
                                              "src": "41381:5:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                                "typeString": "contract IERC20"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 2693,
                                                  "name": "this",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": -28,
                                                  "src": "41396:4:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                                    "typeString": "contract KashiPairMediumRiskV1"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                                    "typeString": "contract KashiPairMediumRiskV1"
                                                  }
                                                ],
                                                "id": 2692,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "41388:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_address_$",
                                                  "typeString": "type(address)"
                                                },
                                                "typeName": {
                                                  "id": 2691,
                                                  "name": "address",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "41388:7:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": null,
                                                    "typeString": null
                                                  }
                                                }
                                              },
                                              "id": 2694,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "41388:13:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                                "typeString": "contract IERC20"
                                              },
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 2688,
                                              "name": "bentoBox",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 1983,
                                              "src": "41362:8:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                                "typeString": "contract IBentoBoxV1"
                                              }
                                            },
                                            "id": 2689,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "balanceOf",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 1512,
                                            "src": "41362:18:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_address_$returns$_t_uint256_$",
                                              "typeString": "function (contract IERC20,address) view external returns (uint256)"
                                            }
                                          },
                                          "id": 2695,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "41362:40:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 2696,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sub",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 47,
                                        "src": "41362:44: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": 2698,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "41362:51:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "41353:60:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4b61736869506169723a20536b696d20746f6f206d756368",
                                    "id": 2700,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "41415:26:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_e71f32bcbd74cb3fdb0838c88f602025bc3767b7f702206de0370d9512f76883",
                                      "typeString": "literal_string \"KashiPair: Skim too much\""
                                    },
                                    "value": "KashiPair: Skim too much"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_e71f32bcbd74cb3fdb0838c88f602025bc3767b7f702206de0370d9512f76883",
                                      "typeString": "literal_string \"KashiPair: Skim too much\""
                                    }
                                  ],
                                  "id": 2686,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "41345:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 2701,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "41345:97:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2702,
                              "nodeType": "ExpressionStatement",
                              "src": "41345:97:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2674,
                    "nodeType": "StructuredDocumentation",
                    "src": "40749:435:0",
                    "text": "@dev Helper function to move tokens.\n @param token The ERC-20 token.\n @param share The amount in shares to add.\n @param total Grand total amount to deduct from this contract's balance. Only applicable if `skim` is True.\n Only used for accounting checks.\n @param skim If True, only does a balance check on this contract.\n False if tokens from msg.sender in `bentoBox` should be transferred."
                  },
                  "id": 2720,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_addTokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2683,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2676,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2720,
                        "src": "41218:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$1118",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2675,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1118,
                          "src": "41218:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$1118",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2678,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2720,
                        "src": "41240:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2677,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "41240:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2680,
                        "mutability": "mutable",
                        "name": "total",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2720,
                        "src": "41263:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2679,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "41263:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2682,
                        "mutability": "mutable",
                        "name": "skim",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2720,
                        "src": "41286:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2681,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41286:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41208:93:0"
                  },
                  "returnParameters": {
                    "id": 2684,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "41311:0:0"
                  },
                  "scope": 4810,
                  "src": "41189:359:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2772,
                    "nodeType": "Block",
                    "src": "42002:359:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2739,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2730,
                              "name": "userCollateralShare",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2009,
                              "src": "42012:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2732,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2731,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2723,
                              "src": "42032:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "42012:23:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2737,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2727,
                                "src": "42066:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2733,
                                  "name": "userCollateralShare",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2009,
                                  "src": "42038:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2735,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2734,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2723,
                                  "src": "42058:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "42038:23:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2736,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25,
                              "src": "42038:27: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": 2738,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "42038:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42012:60:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2740,
                        "nodeType": "ExpressionStatement",
                        "src": "42012:60:0"
                      },
                      {
                        "assignments": [
                          2742
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2742,
                            "mutability": "mutable",
                            "name": "oldTotalCollateralShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2772,
                            "src": "42082:31:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2741,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "42082:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2744,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 2743,
                          "name": "totalCollateralShare",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2001,
                          "src": "42116:20:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "42082:54:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2750,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2745,
                            "name": "totalCollateralShare",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2001,
                            "src": "42146:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2748,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2727,
                                "src": "42197:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2746,
                                "name": "oldTotalCollateralShare",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2742,
                                "src": "42169:23:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2747,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25,
                              "src": "42169:27: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": 2749,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "42169:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42146:57:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2751,
                        "nodeType": "ExpressionStatement",
                        "src": "42146:57:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2753,
                              "name": "collateral",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1993,
                              "src": "42224:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2754,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2727,
                              "src": "42236:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2755,
                              "name": "oldTotalCollateralShare",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2742,
                              "src": "42243:23:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2756,
                              "name": "skim",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2725,
                              "src": "42268:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 2752,
                            "name": "_addTokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2720,
                            "src": "42213:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$1118_$_t_uint256_$_t_uint256_$_t_bool_$returns$__$",
                              "typeString": "function (contract IERC20,uint256,uint256,bool)"
                            }
                          },
                          "id": 2757,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42213:60:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2758,
                        "nodeType": "ExpressionStatement",
                        "src": "42213:60:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "condition": {
                                "argumentTypes": null,
                                "id": 2760,
                                "name": "skim",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2725,
                                "src": "42305:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2765,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "42332:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 2766,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "42332:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "id": 2767,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "Conditional",
                              "src": "42305:37:0",
                              "trueExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2763,
                                    "name": "bentoBox",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1983,
                                    "src": "42320:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  ],
                                  "id": 2762,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "42312:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2761,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "42312:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2764,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "42312:17:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2768,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2723,
                              "src": "42344:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2769,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2727,
                              "src": "42348:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2759,
                            "name": "LogAddCollateral",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1921,
                            "src": "42288:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2770,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42288:66:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2771,
                        "nodeType": "EmitStatement",
                        "src": "42283:71:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2721,
                    "nodeType": "StructuredDocumentation",
                    "src": "41554:345:0",
                    "text": "@notice Adds `collateral` from msg.sender to the account `to`.\n @param to The receiver of the tokens.\n @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\n False if tokens from msg.sender in `bentoBox` should be transferred.\n @param share The amount of shares to add for `to`."
                  },
                  "functionSelector": "860ffea1",
                  "id": 2773,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addCollateral",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2728,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2723,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2773,
                        "src": "41936:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2722,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "41936:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2725,
                        "mutability": "mutable",
                        "name": "skim",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2773,
                        "src": "41956:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2724,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41956:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2727,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2773,
                        "src": "41975:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2726,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "41975:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41926:68:0"
                  },
                  "returnParameters": {
                    "id": 2729,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42002:0:0"
                  },
                  "scope": 4810,
                  "src": "41904:457:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2820,
                    "nodeType": "Block",
                    "src": "42490:279:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2792,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2781,
                              "name": "userCollateralShare",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2009,
                              "src": "42500:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2784,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2782,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "42520:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2783,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "42520:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "42500:31:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2790,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2778,
                                "src": "42570:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2785,
                                  "name": "userCollateralShare",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2009,
                                  "src": "42534:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2788,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2786,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "42554:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 2787,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "42554:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "42534:31:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2789,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 47,
                              "src": "42534:35: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": 2791,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "42534:42:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42500:76:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2793,
                        "nodeType": "ExpressionStatement",
                        "src": "42500:76:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2799,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2794,
                            "name": "totalCollateralShare",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2001,
                            "src": "42586:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2797,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2778,
                                "src": "42634:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2795,
                                "name": "totalCollateralShare",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2001,
                                "src": "42609:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2796,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 47,
                              "src": "42609: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": 2798,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "42609:31:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42586:54:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2800,
                        "nodeType": "ExpressionStatement",
                        "src": "42586:54:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2802,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "42675:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2803,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "42675:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2804,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2776,
                              "src": "42687:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2805,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2778,
                              "src": "42691:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2801,
                            "name": "LogRemoveCollateral",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1939,
                            "src": "42655:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2806,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42655:42:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2807,
                        "nodeType": "EmitStatement",
                        "src": "42650:47:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2811,
                              "name": "collateral",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1993,
                              "src": "42725:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2814,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "42745:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                    "typeString": "contract KashiPairMediumRiskV1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                    "typeString": "contract KashiPairMediumRiskV1"
                                  }
                                ],
                                "id": 2813,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "42737:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2812,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "42737:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2815,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42737:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2816,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2776,
                              "src": "42752:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2817,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2778,
                              "src": "42756:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2808,
                              "name": "bentoBox",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1983,
                              "src": "42707:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                "typeString": "contract IBentoBoxV1"
                              }
                            },
                            "id": 2810,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1742,
                            "src": "42707:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256) external"
                            }
                          },
                          "id": 2818,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42707:55:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2819,
                        "nodeType": "ExpressionStatement",
                        "src": "42707:55:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2774,
                    "nodeType": "StructuredDocumentation",
                    "src": "42367:55:0",
                    "text": "@dev Concrete implementation of `removeCollateral`."
                  },
                  "id": 2821,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_removeCollateral",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2779,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2776,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2821,
                        "src": "42454:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2775,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "42454:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2778,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2821,
                        "src": "42466:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2777,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "42466:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "42453:27:0"
                  },
                  "returnParameters": {
                    "id": 2780,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42490:0:0"
                  },
                  "scope": 4810,
                  "src": "42427:342:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2839,
                    "nodeType": "Block",
                    "src": "43017:122:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2831,
                            "name": "accrue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2553,
                            "src": "43086:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 2832,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43086:8:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2833,
                        "nodeType": "ExpressionStatement",
                        "src": "43086:8:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2835,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2824,
                              "src": "43122:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2836,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2826,
                              "src": "43126:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2834,
                            "name": "_removeCollateral",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2821,
                            "src": "43104:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 2837,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43104:28:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2838,
                        "nodeType": "ExpressionStatement",
                        "src": "43104:28:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2822,
                    "nodeType": "StructuredDocumentation",
                    "src": "42775:169:0",
                    "text": "@notice Removes `share` amount of collateral and transfers it to `to`.\n @param to The receiver of the shares.\n @param share Amount of shares to remove."
                  },
                  "functionSelector": "876467f8",
                  "id": 2840,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 2829,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2828,
                        "name": "solvent",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2639,
                        "src": "43009:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "43009:7:0"
                    }
                  ],
                  "name": "removeCollateral",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2827,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2824,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2840,
                        "src": "42975:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2823,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "42975:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2826,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2840,
                        "src": "42987:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2825,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "42987:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "42974:27:0"
                  },
                  "returnParameters": {
                    "id": 2830,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43017:0:0"
                  },
                  "scope": 4810,
                  "src": "42949:190:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2942,
                    "nodeType": "Block",
                    "src": "43320:638:0",
                    "statements": [
                      {
                        "assignments": [
                          2853
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2853,
                            "mutability": "mutable",
                            "name": "_totalAsset",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2942,
                            "src": "43330:25:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2852,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 753,
                              "src": "43330:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2855,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 2854,
                          "name": "totalAsset",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2003,
                          "src": "43358:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43330:38:0"
                      },
                      {
                        "assignments": [
                          2857
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2857,
                            "mutability": "mutable",
                            "name": "totalAssetShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2942,
                            "src": "43378:23:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2856,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "43378:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2860,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2858,
                            "name": "_totalAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2853,
                            "src": "43404:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "id": 2859,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "elastic",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 750,
                          "src": "43404:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43378:45:0"
                      },
                      {
                        "assignments": [
                          2862
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2862,
                            "mutability": "mutable",
                            "name": "allShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2942,
                            "src": "43433:16:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2861,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "43433:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2873,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2872,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2863,
                              "name": "_totalAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2853,
                              "src": "43452:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 2864,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "43452:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2867,
                                "name": "asset",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1995,
                                "src": "43491:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2868,
                                  "name": "totalBorrow",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2005,
                                  "src": "43498:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                    "typeString": "struct Rebase storage ref"
                                  }
                                },
                                "id": 2869,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "43498:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 2870,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "43519:4:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2865,
                                "name": "bentoBox",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1983,
                                "src": "43474:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                  "typeString": "contract IBentoBoxV1"
                                }
                              },
                              "id": 2866,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toShare",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1724,
                              "src": "43474:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (contract IERC20,uint256,bool) view external returns (uint256)"
                              }
                            },
                            "id": 2871,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "43474:50:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "43452:72:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43433:91:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2887,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2874,
                            "name": "fraction",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2850,
                            "src": "43534:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "condition": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2877,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2875,
                                "name": "allShare",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2862,
                                "src": "43545:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 2876,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "43557:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "43545:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "falseExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2885,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2881,
                                      "name": "_totalAsset",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2853,
                                      "src": "43579:11:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                        "typeString": "struct Rebase memory"
                                      }
                                    },
                                    "id": 2882,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "base",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 752,
                                    "src": "43579:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint128",
                                      "typeString": "uint128"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2879,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2847,
                                    "src": "43569:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2880,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mul",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 75,
                                  "src": "43569:9: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": 2883,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "43569:27:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "/",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 2884,
                                "name": "allShare",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2862,
                                "src": "43599:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "43569:38:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2886,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "Conditional",
                            "src": "43545:62:0",
                            "trueExpression": {
                              "argumentTypes": null,
                              "id": 2878,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2847,
                              "src": "43561:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "43534:73:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2888,
                        "nodeType": "ExpressionStatement",
                        "src": "43534:73:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 2897,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2892,
                                    "name": "fraction",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2850,
                                    "src": "43642:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2893,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "43642:14:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 2894,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "43642:16:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2889,
                                  "name": "_totalAsset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2853,
                                  "src": "43621:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 2890,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "43621:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 2891,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "43621:20: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": 2895,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "43621:38:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "31303030",
                            "id": 2896,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "43662:4:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1000_by_1",
                              "typeString": "int_const 1000"
                            },
                            "value": "1000"
                          },
                          "src": "43621:45:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2901,
                        "nodeType": "IfStatement",
                        "src": "43617:84:0",
                        "trueBody": {
                          "id": 2900,
                          "nodeType": "Block",
                          "src": "43668:33:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 2898,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "43689:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 2851,
                              "id": 2899,
                              "nodeType": "Return",
                              "src": "43682:8:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2908,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2902,
                            "name": "totalAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2003,
                            "src": "43710:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2905,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2847,
                                "src": "43739:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 2906,
                                "name": "fraction",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2850,
                                "src": "43746:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2903,
                                "name": "_totalAsset",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2853,
                                "src": "43723:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              "id": 2904,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1013,
                              "src": "43723:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_struct$_Rebase_$753_memory_ptr_$bound_to$_t_struct$_Rebase_$753_memory_ptr_$",
                                "typeString": "function (struct Rebase memory,uint256,uint256) pure returns (struct Rebase memory)"
                              }
                            },
                            "id": 2907,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "43723:32:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "43710:45:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 2909,
                        "nodeType": "ExpressionStatement",
                        "src": "43710:45:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2919,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2910,
                              "name": "balanceOf",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 423,
                              "src": "43765:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2912,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2911,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2843,
                              "src": "43775:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "43765:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2917,
                                "name": "fraction",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2850,
                                "src": "43799:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2913,
                                  "name": "balanceOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 423,
                                  "src": "43781:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2915,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2914,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2843,
                                  "src": "43791:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "43781:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2916,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25,
                              "src": "43781: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": 2918,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "43781:27:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "43765:43:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2920,
                        "nodeType": "ExpressionStatement",
                        "src": "43765:43:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2922,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1995,
                              "src": "43829:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2923,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2847,
                              "src": "43836:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2924,
                              "name": "totalAssetShare",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2857,
                              "src": "43843:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2925,
                              "name": "skim",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2845,
                              "src": "43860:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 2921,
                            "name": "_addTokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2720,
                            "src": "43818:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$1118_$_t_uint256_$_t_uint256_$_t_bool_$returns$__$",
                              "typeString": "function (contract IERC20,uint256,uint256,bool)"
                            }
                          },
                          "id": 2926,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43818:47:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2927,
                        "nodeType": "ExpressionStatement",
                        "src": "43818:47:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "condition": {
                                "argumentTypes": null,
                                "id": 2929,
                                "name": "skim",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2845,
                                "src": "43892:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2934,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "43919:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 2935,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "43919:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "id": 2936,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "Conditional",
                              "src": "43892:37:0",
                              "trueExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2932,
                                    "name": "bentoBox",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1983,
                                    "src": "43907:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  ],
                                  "id": 2931,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "43899:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2930,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "43899:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2933,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "43899:17:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2937,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2843,
                              "src": "43931:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2938,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2847,
                              "src": "43935:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2939,
                              "name": "fraction",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2850,
                              "src": "43942:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2928,
                            "name": "LogAddAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1931,
                            "src": "43880:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256)"
                            }
                          },
                          "id": 2940,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43880:71:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2941,
                        "nodeType": "EmitStatement",
                        "src": "43875:76:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2841,
                    "nodeType": "StructuredDocumentation",
                    "src": "43145:47:0",
                    "text": "@dev Concrete implementation of `addAsset`."
                  },
                  "id": 2943,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_addAsset",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2848,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2843,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2943,
                        "src": "43225:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2842,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "43225:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2845,
                        "mutability": "mutable",
                        "name": "skim",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2943,
                        "src": "43245:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2844,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43245:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2847,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2943,
                        "src": "43264:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2846,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "43264:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43215:68:0"
                  },
                  "returnParameters": {
                    "id": 2851,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2850,
                        "mutability": "mutable",
                        "name": "fraction",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2943,
                        "src": "43302:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2849,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "43302:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43301:18:0"
                  },
                  "scope": 4810,
                  "src": "43197:761:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2966,
                    "nodeType": "Block",
                    "src": "44470:72:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2955,
                            "name": "accrue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2553,
                            "src": "44480:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 2956,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44480:8:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2957,
                        "nodeType": "ExpressionStatement",
                        "src": "44480:8:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2964,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2958,
                            "name": "fraction",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2953,
                            "src": "44498:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2960,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2946,
                                "src": "44519:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 2961,
                                "name": "skim",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2948,
                                "src": "44523:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 2962,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2950,
                                "src": "44529:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 2959,
                              "name": "_addAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2943,
                              "src": "44509:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$_t_uint256_$returns$_t_uint256_$",
                                "typeString": "function (address,bool,uint256) returns (uint256)"
                              }
                            },
                            "id": 2963,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "44509:26:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "44498:37:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2965,
                        "nodeType": "ExpressionStatement",
                        "src": "44498:37:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2944,
                    "nodeType": "StructuredDocumentation",
                    "src": "43964:381:0",
                    "text": "@notice Adds assets to the lending pair.\n @param to The address of the user to receive the assets.\n @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\n False if tokens from msg.sender in `bentoBox` should be transferred.\n @param share The amount of shares to add.\n @return fraction Total fractions added."
                  },
                  "functionSelector": "1b51e940",
                  "id": 2967,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addAsset",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2951,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2946,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2967,
                        "src": "44377:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2945,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "44377:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2948,
                        "mutability": "mutable",
                        "name": "skim",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2967,
                        "src": "44397:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2947,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44397:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2950,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2967,
                        "src": "44416:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2949,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "44416:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44367:68:0"
                  },
                  "returnParameters": {
                    "id": 2954,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2953,
                        "mutability": "mutable",
                        "name": "fraction",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2967,
                        "src": "44452:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2952,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "44452:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44451:18:0"
                  },
                  "scope": 4810,
                  "src": "44350:192:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3073,
                    "nodeType": "Block",
                    "src": "44688:644:0",
                    "statements": [
                      {
                        "assignments": [
                          2978
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2978,
                            "mutability": "mutable",
                            "name": "_totalAsset",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3073,
                            "src": "44698:25:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 2977,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 753,
                              "src": "44698:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2980,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 2979,
                          "name": "totalAsset",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2003,
                          "src": "44726:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "44698:38:0"
                      },
                      {
                        "assignments": [
                          2982
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2982,
                            "mutability": "mutable",
                            "name": "allShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3073,
                            "src": "44746:16:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2981,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "44746:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2993,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2992,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2983,
                              "name": "_totalAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2978,
                              "src": "44765:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 2984,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "44765:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2987,
                                "name": "asset",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1995,
                                "src": "44804:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2988,
                                  "name": "totalBorrow",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2005,
                                  "src": "44811:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                    "typeString": "struct Rebase storage ref"
                                  }
                                },
                                "id": 2989,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "44811:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 2990,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "44832:4:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2985,
                                "name": "bentoBox",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1983,
                                "src": "44787:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                  "typeString": "contract IBentoBoxV1"
                                }
                              },
                              "id": 2986,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toShare",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1724,
                              "src": "44787:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (contract IERC20,uint256,bool) view external returns (uint256)"
                              }
                            },
                            "id": 2991,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "44787:50:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "44765:72:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "44746:91:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3002,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2994,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2975,
                            "src": "44847:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 3001,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2997,
                                  "name": "allShare",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2982,
                                  "src": "44868:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2995,
                                  "name": "fraction",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2972,
                                  "src": "44855:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2996,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "mul",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 75,
                                "src": "44855:12: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": 2998,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "44855:22:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2999,
                                "name": "_totalAsset",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2978,
                                "src": "44880:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                  "typeString": "struct Rebase memory"
                                }
                              },
                              "id": 3000,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "base",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 752,
                              "src": "44880:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "src": "44855:41:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "44847:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3003,
                        "nodeType": "ExpressionStatement",
                        "src": "44847:49:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3015,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3004,
                              "name": "balanceOf",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 423,
                              "src": "44906:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 3007,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3005,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "44916:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3006,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "44916:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "44906:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3013,
                                "name": "fraction",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2972,
                                "src": "44956:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 3008,
                                  "name": "balanceOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 423,
                                  "src": "44930:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 3011,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3009,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "44940:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 3010,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "44940:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "44930:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3012,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 47,
                              "src": "44930:25: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": 3014,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "44930:35:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "44906:59:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3016,
                        "nodeType": "ExpressionStatement",
                        "src": "44906:59:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3027,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3017,
                              "name": "_totalAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2978,
                              "src": "44975:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 3019,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "44975:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3023,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2975,
                                    "src": "45021:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 3024,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "45021:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 3025,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "45021:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3020,
                                  "name": "_totalAsset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2978,
                                  "src": "44997:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 3021,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "44997:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 3022,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "44997:23: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": 3026,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "44997:38:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "44975:60:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 3028,
                        "nodeType": "ExpressionStatement",
                        "src": "44975:60:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3039,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3029,
                              "name": "_totalAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2978,
                              "src": "45045:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 3031,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "45045:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3035,
                                    "name": "fraction",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2972,
                                    "src": "45085:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 3036,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "45085:14:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 3037,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "45085:16:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3032,
                                  "name": "_totalAsset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2978,
                                  "src": "45064:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 3033,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "45064:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 3034,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "45064:20: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": 3038,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "45064:38:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "45045:57:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 3040,
                        "nodeType": "ExpressionStatement",
                        "src": "45045:57:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              "id": 3045,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3042,
                                  "name": "_totalAsset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2978,
                                  "src": "45120:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 3043,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "45120:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "31303030",
                                "id": 3044,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "45140:4:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1000_by_1",
                                  "typeString": "int_const 1000"
                                },
                                "value": "1000"
                              },
                              "src": "45120:24:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b617368693a2062656c6f77206d696e696d756d",
                              "id": 3046,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "45146:22:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_dcff8969df53f8a4278387c83cbd616944bcfdf1b74d0f3f5755ced18475db8c",
                                "typeString": "literal_string \"Kashi: below minimum\""
                              },
                              "value": "Kashi: below minimum"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_dcff8969df53f8a4278387c83cbd616944bcfdf1b74d0f3f5755ced18475db8c",
                                "typeString": "literal_string \"Kashi: below minimum\""
                              }
                            ],
                            "id": 3041,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "45112:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3047,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45112:57:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3048,
                        "nodeType": "ExpressionStatement",
                        "src": "45112:57:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3051,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3049,
                            "name": "totalAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2003,
                            "src": "45179:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 3050,
                            "name": "_totalAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2978,
                            "src": "45192:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "45179:24:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 3052,
                        "nodeType": "ExpressionStatement",
                        "src": "45179:24:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3054,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "45233:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3055,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "45233:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3056,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2970,
                              "src": "45245:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3057,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2975,
                              "src": "45249:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3058,
                              "name": "fraction",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2972,
                              "src": "45256:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 3053,
                            "name": "LogRemoveAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1949,
                            "src": "45218:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256)"
                            }
                          },
                          "id": 3059,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45218:47:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3060,
                        "nodeType": "EmitStatement",
                        "src": "45213:52:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3064,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1995,
                              "src": "45293:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3067,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "45308:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                    "typeString": "contract KashiPairMediumRiskV1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                    "typeString": "contract KashiPairMediumRiskV1"
                                  }
                                ],
                                "id": 3066,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "45300:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 3065,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "45300:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 3068,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "45300:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3069,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2970,
                              "src": "45315:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3070,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2975,
                              "src": "45319:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3061,
                              "name": "bentoBox",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1983,
                              "src": "45275:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                "typeString": "contract IBentoBoxV1"
                              }
                            },
                            "id": 3063,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1742,
                            "src": "45275:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256) external"
                            }
                          },
                          "id": 3071,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45275:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3072,
                        "nodeType": "ExpressionStatement",
                        "src": "45275:50:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2968,
                    "nodeType": "StructuredDocumentation",
                    "src": "44548:50:0",
                    "text": "@dev Concrete implementation of `removeAsset`."
                  },
                  "id": 3074,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_removeAsset",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2973,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2970,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3074,
                        "src": "44625:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2969,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "44625:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2972,
                        "mutability": "mutable",
                        "name": "fraction",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3074,
                        "src": "44637:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2971,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "44637:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44624:30:0"
                  },
                  "returnParameters": {
                    "id": 2976,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2975,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3074,
                        "src": "44673:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2974,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "44673:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44672:15:0"
                  },
                  "scope": 4810,
                  "src": "44603:729:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3094,
                    "nodeType": "Block",
                    "src": "45690:69:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3084,
                            "name": "accrue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2553,
                            "src": "45700:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 3085,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45700:8:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3086,
                        "nodeType": "ExpressionStatement",
                        "src": "45700:8:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3092,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3087,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3082,
                            "src": "45718:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3089,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3077,
                                "src": "45739:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 3090,
                                "name": "fraction",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3079,
                                "src": "45743:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 3088,
                              "name": "_removeAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3074,
                              "src": "45726:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_uint256_$",
                                "typeString": "function (address,uint256) returns (uint256)"
                              }
                            },
                            "id": 3091,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "45726:26:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "45718:34:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3093,
                        "nodeType": "ExpressionStatement",
                        "src": "45718:34:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3075,
                    "nodeType": "StructuredDocumentation",
                    "src": "45338:265:0",
                    "text": "@notice Removes an asset from msg.sender and transfers it to `to`.\n @param to The user that receives the removed assets.\n @param fraction The amount/fraction of assets held to remove.\n @return share The amount of shares transferred to `to`."
                  },
                  "functionSelector": "2317ef67",
                  "id": 3095,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "removeAsset",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3080,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3077,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3095,
                        "src": "45629:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3076,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "45629:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3079,
                        "mutability": "mutable",
                        "name": "fraction",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3095,
                        "src": "45641:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3078,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "45641:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45628:30:0"
                  },
                  "returnParameters": {
                    "id": 3083,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3082,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3095,
                        "src": "45675:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3081,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "45675:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45674:15:0"
                  },
                  "scope": 4810,
                  "src": "45608:151:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3200,
                    "nodeType": "Block",
                    "src": "45907:693:0",
                    "statements": [
                      {
                        "assignments": [
                          3108
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3108,
                            "mutability": "mutable",
                            "name": "feeAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3200,
                            "src": "45917:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 3107,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "45917:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3115,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3114,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3111,
                                "name": "BORROW_OPENING_FEE",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2155,
                                "src": "45948:18:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3109,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3100,
                                "src": "45937:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3110,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "mul",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 75,
                              "src": "45937: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": 3112,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "45937:30:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 3113,
                            "name": "BORROW_OPENING_FEE_PRECISION",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2158,
                            "src": "45970:28:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "45937:61:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "45917:81:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3127,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "id": 3116,
                                "name": "totalBorrow",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2005,
                                "src": "46052:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                  "typeString": "struct Rebase storage ref"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 3117,
                                "name": "part",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3103,
                                "src": "46065:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 3118,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "TupleExpression",
                            "src": "46051:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_struct$_Rebase_$753_storage_$_t_uint256_$",
                              "typeString": "tuple(struct Rebase storage ref,uint256)"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 3123,
                                    "name": "feeAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3108,
                                    "src": "46100:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3121,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3100,
                                    "src": "46089:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 3122,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "add",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 25,
                                  "src": "46089: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": 3124,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "46089:21:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 3125,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "46112: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": 3119,
                                "name": "totalBorrow",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2005,
                                "src": "46073:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                  "typeString": "struct Rebase storage ref"
                                }
                              },
                              "id": 3120,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 923,
                              "src": "46073:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$bound_to$_t_struct$_Rebase_$753_memory_ptr_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (struct Rebase memory,uint256)"
                              }
                            },
                            "id": 3126,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "46073:44:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$",
                              "typeString": "tuple(struct Rebase memory,uint256)"
                            }
                          },
                          "src": "46051:66:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3128,
                        "nodeType": "ExpressionStatement",
                        "src": "46051:66:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3140,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3129,
                              "name": "userBorrowPart",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2013,
                              "src": "46127:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 3132,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3130,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "46142:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3131,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "46142:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "46127:26:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3138,
                                "name": "part",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3103,
                                "src": "46187:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 3133,
                                  "name": "userBorrowPart",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2013,
                                  "src": "46156:14:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 3136,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3134,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "46171:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 3135,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "46171:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "46156:26:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3137,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25,
                              "src": "46156:30: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": 3139,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "46156:36:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "46127:65:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3141,
                        "nodeType": "ExpressionStatement",
                        "src": "46127:65:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3143,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "46217:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3144,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "46217:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3145,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3098,
                              "src": "46229:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3146,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3100,
                              "src": "46233:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3147,
                              "name": "feeAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3108,
                              "src": "46241:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3148,
                              "name": "part",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3103,
                              "src": "46252:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 3142,
                            "name": "LogBorrow",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1961,
                            "src": "46207:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256,uint256)"
                            }
                          },
                          "id": 3149,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46207:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3150,
                        "nodeType": "EmitStatement",
                        "src": "46202:55:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3158,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3151,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3105,
                            "src": "46268:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3154,
                                "name": "asset",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1995,
                                "src": "46293:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 3155,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3100,
                                "src": "46300:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 3156,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "46308:5:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3152,
                                "name": "bentoBox",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1983,
                                "src": "46276:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                  "typeString": "contract IBentoBoxV1"
                                }
                              },
                              "id": 3153,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toShare",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1724,
                              "src": "46276:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                "typeString": "function (contract IERC20,uint256,bool) view external returns (uint256)"
                              }
                            },
                            "id": 3157,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "46276:38:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "46268:46:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3159,
                        "nodeType": "ExpressionStatement",
                        "src": "46268:46:0"
                      },
                      {
                        "assignments": [
                          3161
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3161,
                            "mutability": "mutable",
                            "name": "_totalAsset",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3200,
                            "src": "46324:25:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 3160,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 753,
                              "src": "46324:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3163,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 3162,
                          "name": "totalAsset",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2003,
                          "src": "46352:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "46324:38:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              "id": 3168,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3165,
                                  "name": "_totalAsset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3161,
                                  "src": "46380:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 3166,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "46380:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "31303030",
                                "id": 3167,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "46400:4:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1000_by_1",
                                  "typeString": "int_const 1000"
                                },
                                "value": "1000"
                              },
                              "src": "46380:24:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b617368693a2062656c6f77206d696e696d756d",
                              "id": 3169,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "46406:22:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_dcff8969df53f8a4278387c83cbd616944bcfdf1b74d0f3f5755ced18475db8c",
                                "typeString": "literal_string \"Kashi: below minimum\""
                              },
                              "value": "Kashi: below minimum"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_dcff8969df53f8a4278387c83cbd616944bcfdf1b74d0f3f5755ced18475db8c",
                                "typeString": "literal_string \"Kashi: below minimum\""
                              }
                            ],
                            "id": 3164,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "46372:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3170,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46372:57:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3171,
                        "nodeType": "ExpressionStatement",
                        "src": "46372:57:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3182,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3172,
                              "name": "_totalAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3161,
                              "src": "46439:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 3174,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "46439:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3178,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3105,
                                    "src": "46485:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 3179,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "46485:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 3180,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "46485:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3175,
                                  "name": "_totalAsset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3161,
                                  "src": "46461:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 3176,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "46461:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 3177,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "46461:23: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": 3181,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "46461:38:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "46439:60:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 3183,
                        "nodeType": "ExpressionStatement",
                        "src": "46439:60:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3186,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3184,
                            "name": "totalAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2003,
                            "src": "46509:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 3185,
                            "name": "_totalAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3161,
                            "src": "46522:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "46509:24:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 3187,
                        "nodeType": "ExpressionStatement",
                        "src": "46509:24:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3191,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1995,
                              "src": "46561:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3194,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "46576:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                    "typeString": "contract KashiPairMediumRiskV1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                    "typeString": "contract KashiPairMediumRiskV1"
                                  }
                                ],
                                "id": 3193,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "46568:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 3192,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "46568:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 3195,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "46568:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3196,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3098,
                              "src": "46583:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3197,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3105,
                              "src": "46587:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3188,
                              "name": "bentoBox",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1983,
                              "src": "46543:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                "typeString": "contract IBentoBoxV1"
                              }
                            },
                            "id": 3190,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1742,
                            "src": "46543:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20,address,address,uint256) external"
                            }
                          },
                          "id": 3198,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46543:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3199,
                        "nodeType": "ExpressionStatement",
                        "src": "46543:50:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3096,
                    "nodeType": "StructuredDocumentation",
                    "src": "45765:45:0",
                    "text": "@dev Concrete implementation of `borrow`."
                  },
                  "id": 3201,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_borrow",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3101,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3098,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3201,
                        "src": "45832:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3097,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "45832:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3100,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3201,
                        "src": "45844:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3099,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "45844:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45831:28:0"
                  },
                  "returnParameters": {
                    "id": 3106,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3103,
                        "mutability": "mutable",
                        "name": "part",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3201,
                        "src": "45878:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3102,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "45878:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3105,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3201,
                        "src": "45892:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3104,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "45892:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45877:29:0"
                  },
                  "scope": 4810,
                  "src": "45815:785:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3227,
                    "nodeType": "Block",
                    "src": "46887:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3215,
                            "name": "accrue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2553,
                            "src": "46897:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 3216,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46897:8:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3217,
                        "nodeType": "ExpressionStatement",
                        "src": "46897:8:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3225,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "id": 3218,
                                "name": "part",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3211,
                                "src": "46916:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 3219,
                                "name": "share",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3213,
                                "src": "46922:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 3220,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "TupleExpression",
                            "src": "46915:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                              "typeString": "tuple(uint256,uint256)"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3222,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3204,
                                "src": "46939:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 3223,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3206,
                                "src": "46943:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 3221,
                              "name": "_borrow",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3201,
                              "src": "46931:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                "typeString": "function (address,uint256) returns (uint256,uint256)"
                              }
                            },
                            "id": 3224,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "46931:19:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                              "typeString": "tuple(uint256,uint256)"
                            }
                          },
                          "src": "46915:35:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3226,
                        "nodeType": "ExpressionStatement",
                        "src": "46915:35:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3202,
                    "nodeType": "StructuredDocumentation",
                    "src": "46606:179:0",
                    "text": "@notice Sender borrows `amount` and transfers it to `to`.\n @return part Total part of the debt held by borrowers.\n @return share Total amount in shares borrowed."
                  },
                  "functionSelector": "4b8a3529",
                  "id": 3228,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 3209,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 3208,
                        "name": "solvent",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2639,
                        "src": "46841:7:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "46841:7:0"
                    }
                  ],
                  "name": "borrow",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3207,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3204,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3228,
                        "src": "46806:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3203,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "46806:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3206,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3228,
                        "src": "46818:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3205,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "46818:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "46805:28:0"
                  },
                  "returnParameters": {
                    "id": 3214,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3211,
                        "mutability": "mutable",
                        "name": "part",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3228,
                        "src": "46858:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3210,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "46858:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3213,
                        "mutability": "mutable",
                        "name": "share",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3228,
                        "src": "46872:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3212,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "46872:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "46857:29:0"
                  },
                  "scope": 4810,
                  "src": "46790:167:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3310,
                    "nodeType": "Block",
                    "src": "47129:441:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3248,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "id": 3240,
                                "name": "totalBorrow",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2005,
                                "src": "47140:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                  "typeString": "struct Rebase storage ref"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 3241,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3238,
                                "src": "47153:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 3242,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "TupleExpression",
                            "src": "47139:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_struct$_Rebase_$753_storage_$_t_uint256_$",
                              "typeString": "tuple(struct Rebase storage ref,uint256)"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3245,
                                "name": "part",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3235,
                                "src": "47179:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 3246,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "47185: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": 3243,
                                "name": "totalBorrow",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2005,
                                "src": "47163:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                  "typeString": "struct Rebase storage ref"
                                }
                              },
                              "id": 3244,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 974,
                              "src": "47163:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$bound_to$_t_struct$_Rebase_$753_memory_ptr_$",
                                "typeString": "function (struct Rebase memory,uint256,bool) pure returns (struct Rebase memory,uint256)"
                              }
                            },
                            "id": 3247,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "47163:27:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$",
                              "typeString": "tuple(struct Rebase memory,uint256)"
                            }
                          },
                          "src": "47139:51:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3249,
                        "nodeType": "ExpressionStatement",
                        "src": "47139:51:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3259,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3250,
                              "name": "userBorrowPart",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2013,
                              "src": "47200:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 3252,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3251,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3231,
                              "src": "47215:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "47200:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3257,
                                "name": "part",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3235,
                                "src": "47244:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 3253,
                                  "name": "userBorrowPart",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2013,
                                  "src": "47221:14:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 3255,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 3254,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3231,
                                  "src": "47236:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "47221:18:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3256,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 47,
                              "src": "47221:22: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": 3258,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "47221:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "47200:49:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3260,
                        "nodeType": "ExpressionStatement",
                        "src": "47200:49:0"
                      },
                      {
                        "assignments": [
                          3262
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3262,
                            "mutability": "mutable",
                            "name": "share",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3310,
                            "src": "47260:13:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 3261,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "47260:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3269,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3265,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1995,
                              "src": "47293:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3266,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3238,
                              "src": "47300:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 3267,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "47308:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3263,
                              "name": "bentoBox",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1983,
                              "src": "47276:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                "typeString": "contract IBentoBoxV1"
                              }
                            },
                            "id": 3264,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "toShare",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1724,
                            "src": "47276:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                              "typeString": "function (contract IERC20,uint256,bool) view external returns (uint256)"
                            }
                          },
                          "id": 3268,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47276:37:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "47260:53:0"
                      },
                      {
                        "assignments": [
                          3271
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3271,
                            "mutability": "mutable",
                            "name": "totalShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3310,
                            "src": "47323:18:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            },
                            "typeName": {
                              "id": 3270,
                              "name": "uint128",
                              "nodeType": "ElementaryTypeName",
                              "src": "47323:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3274,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 3272,
                            "name": "totalAsset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2003,
                            "src": "47344:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "id": 3273,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "elastic",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 750,
                          "src": "47344:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "47323:39:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3276,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1995,
                              "src": "47383:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3277,
                              "name": "share",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3262,
                              "src": "47390:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3280,
                                  "name": "totalShare",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3271,
                                  "src": "47405:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                ],
                                "id": 3279,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "47397:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 3278,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "47397:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 3281,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "47397:19:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3282,
                              "name": "skim",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3233,
                              "src": "47418:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 3275,
                            "name": "_addTokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2720,
                            "src": "47372:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$1118_$_t_uint256_$_t_uint256_$_t_bool_$returns$__$",
                              "typeString": "function (contract IERC20,uint256,uint256,bool)"
                            }
                          },
                          "id": 3283,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47372:51:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3284,
                        "nodeType": "ExpressionStatement",
                        "src": "47372:51:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3294,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3285,
                              "name": "totalAsset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2003,
                              "src": "47433:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                "typeString": "struct Rebase storage ref"
                              }
                            },
                            "id": 3287,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "47433:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3290,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3262,
                                    "src": "47469:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 3291,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "47469:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 3292,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "47469:13:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3288,
                                "name": "totalShare",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3271,
                                "src": "47454:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 3289,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 177,
                              "src": "47454: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": 3293,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "47454:29:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "47433:50:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 3295,
                        "nodeType": "ExpressionStatement",
                        "src": "47433:50:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "condition": {
                                "argumentTypes": null,
                                "id": 3297,
                                "name": "skim",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3233,
                                "src": "47507:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3302,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "47534:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 3303,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "47534:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "id": 3304,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "Conditional",
                              "src": "47507:37:0",
                              "trueExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 3300,
                                    "name": "bentoBox",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1983,
                                    "src": "47522:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  ],
                                  "id": 3299,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "47514:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 3298,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "47514:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 3301,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "47514:17:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3305,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3231,
                              "src": "47546:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3306,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3238,
                              "src": "47550:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3307,
                              "name": "part",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3235,
                              "src": "47558:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 3296,
                            "name": "LogRepay",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1971,
                            "src": "47498:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256)"
                            }
                          },
                          "id": 3308,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47498:65:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3309,
                        "nodeType": "EmitStatement",
                        "src": "47493:70:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3229,
                    "nodeType": "StructuredDocumentation",
                    "src": "46963:44:0",
                    "text": "@dev Concrete implementation of `repay`."
                  },
                  "id": 3311,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_repay",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3236,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3231,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3311,
                        "src": "47037:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3230,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47037:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3233,
                        "mutability": "mutable",
                        "name": "skim",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3311,
                        "src": "47057:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3232,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47057:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3235,
                        "mutability": "mutable",
                        "name": "part",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3311,
                        "src": "47076:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3234,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "47076:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47027:67:0"
                  },
                  "returnParameters": {
                    "id": 3239,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3238,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3311,
                        "src": "47113:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3237,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "47113:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47112:16:0"
                  },
                  "scope": 4810,
                  "src": "47012:558:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3334,
                    "nodeType": "Block",
                    "src": "48069:66:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3323,
                            "name": "accrue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2553,
                            "src": "48079:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 3324,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48079:8:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3325,
                        "nodeType": "ExpressionStatement",
                        "src": "48079:8:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3332,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3326,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3321,
                            "src": "48097:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 3328,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3314,
                                "src": "48113:2:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 3329,
                                "name": "skim",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3316,
                                "src": "48117:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 3330,
                                "name": "part",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3318,
                                "src": "48123:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 3327,
                              "name": "_repay",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3311,
                              "src": "48106:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$_t_uint256_$returns$_t_uint256_$",
                                "typeString": "function (address,bool,uint256) returns (uint256)"
                              }
                            },
                            "id": 3331,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "48106:22:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "48097:31:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3333,
                        "nodeType": "ExpressionStatement",
                        "src": "48097:31:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3312,
                    "nodeType": "StructuredDocumentation",
                    "src": "47576:374:0",
                    "text": "@notice Repays a loan.\n @param to Address of the user this payment should go.\n @param skim True if the amount should be skimmed from the deposit balance of msg.sender.\n False if tokens from msg.sender in `bentoBox` should be transferred.\n @param part The amount to repay. See `userBorrowPart`.\n @return amount The total amount repayed."
                  },
                  "functionSelector": "15294c40",
                  "id": 3335,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "repay",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3319,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3314,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3335,
                        "src": "47979:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3313,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47979:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3316,
                        "mutability": "mutable",
                        "name": "skim",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3335,
                        "src": "47999:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3315,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47999:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3318,
                        "mutability": "mutable",
                        "name": "part",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3335,
                        "src": "48018:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3317,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "48018:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47969:67:0"
                  },
                  "returnParameters": {
                    "id": 3322,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3321,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3335,
                        "src": "48053:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3320,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "48053:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "48052:16:0"
                  },
                  "scope": 4810,
                  "src": "47955:180:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "id": 3338,
                  "mutability": "constant",
                  "name": "ACTION_ADD_ASSET",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48188:44:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3336,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48188:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31",
                    "id": 3337,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48231:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1_by_1",
                      "typeString": "int_const 1"
                    },
                    "value": "1"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3341,
                  "mutability": "constant",
                  "name": "ACTION_REPAY",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48238:40:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3339,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48238:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "32",
                    "id": 3340,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48277:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2_by_1",
                      "typeString": "int_const 2"
                    },
                    "value": "2"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3344,
                  "mutability": "constant",
                  "name": "ACTION_REMOVE_ASSET",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48284:47:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3342,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48284:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "33",
                    "id": 3343,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48330:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_3_by_1",
                      "typeString": "int_const 3"
                    },
                    "value": "3"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3347,
                  "mutability": "constant",
                  "name": "ACTION_REMOVE_COLLATERAL",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48337:52:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3345,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48337:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "34",
                    "id": 3346,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48388:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_4_by_1",
                      "typeString": "int_const 4"
                    },
                    "value": "4"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3350,
                  "mutability": "constant",
                  "name": "ACTION_BORROW",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48395:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3348,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48395:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "35",
                    "id": 3349,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48435:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_5_by_1",
                      "typeString": "int_const 5"
                    },
                    "value": "5"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3353,
                  "mutability": "constant",
                  "name": "ACTION_GET_REPAY_SHARE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48442:50:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3351,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48442:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "36",
                    "id": 3352,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48491:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_6_by_1",
                      "typeString": "int_const 6"
                    },
                    "value": "6"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3356,
                  "mutability": "constant",
                  "name": "ACTION_GET_REPAY_PART",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48498:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3354,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48498:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "37",
                    "id": 3355,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48546:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_7_by_1",
                      "typeString": "int_const 7"
                    },
                    "value": "7"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3359,
                  "mutability": "constant",
                  "name": "ACTION_ACCRUE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48553:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3357,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48553:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "38",
                    "id": 3358,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48593:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_8_by_1",
                      "typeString": "int_const 8"
                    },
                    "value": "8"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3362,
                  "mutability": "constant",
                  "name": "ACTION_ADD_COLLATERAL",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48654:50:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3360,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48654:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3130",
                    "id": 3361,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48702:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_10_by_1",
                      "typeString": "int_const 10"
                    },
                    "value": "10"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3365,
                  "mutability": "constant",
                  "name": "ACTION_UPDATE_EXCHANGE_RATE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48710:56:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3363,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48710:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3131",
                    "id": 3364,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48764:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_11_by_1",
                      "typeString": "int_const 11"
                    },
                    "value": "11"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3368,
                  "mutability": "constant",
                  "name": "ACTION_BENTO_DEPOSIT",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48801:49:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3366,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48801:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3230",
                    "id": 3367,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48848:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_20_by_1",
                      "typeString": "int_const 20"
                    },
                    "value": "20"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3371,
                  "mutability": "constant",
                  "name": "ACTION_BENTO_WITHDRAW",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48856:50:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3369,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48856:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3231",
                    "id": 3370,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48904:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_21_by_1",
                      "typeString": "int_const 21"
                    },
                    "value": "21"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3374,
                  "mutability": "constant",
                  "name": "ACTION_BENTO_TRANSFER",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48912:50:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3372,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48912:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3232",
                    "id": 3373,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "48960:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_22_by_1",
                      "typeString": "int_const 22"
                    },
                    "value": "22"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3377,
                  "mutability": "constant",
                  "name": "ACTION_BENTO_TRANSFER_MULTIPLE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "48968:59:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3375,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "48968:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3233",
                    "id": 3376,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "49025:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_23_by_1",
                      "typeString": "int_const 23"
                    },
                    "value": "23"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3380,
                  "mutability": "constant",
                  "name": "ACTION_BENTO_SETAPPROVAL",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "49033:53:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3378,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "49033:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3234",
                    "id": 3379,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "49084:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_24_by_1",
                      "typeString": "int_const 24"
                    },
                    "value": "24"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3383,
                  "mutability": "constant",
                  "name": "ACTION_CALL",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "49139:40:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 3381,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "49139:5:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "3330",
                    "id": 3382,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "49177:2:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_30_by_1",
                      "typeString": "int_const 30"
                    },
                    "value": "30"
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3387,
                  "mutability": "constant",
                  "name": "USE_VALUE1",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "49186:40:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_int256",
                    "typeString": "int256"
                  },
                  "typeName": {
                    "id": 3384,
                    "name": "int256",
                    "nodeType": "ElementaryTypeName",
                    "src": "49186:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "id": 3386,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "-",
                    "prefix": true,
                    "src": "49224:2:0",
                    "subExpression": {
                      "argumentTypes": null,
                      "hexValue": "31",
                      "id": 3385,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "49225: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"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": true,
                  "id": 3391,
                  "mutability": "constant",
                  "name": "USE_VALUE2",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4810,
                  "src": "49232:40:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_int256",
                    "typeString": "int256"
                  },
                  "typeName": {
                    "id": 3388,
                    "name": "int256",
                    "nodeType": "ElementaryTypeName",
                    "src": "49232:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "id": 3390,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "-",
                    "prefix": true,
                    "src": "49270:2:0",
                    "subExpression": {
                      "argumentTypes": null,
                      "hexValue": "32",
                      "id": 3389,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "49271:1:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_2_by_1",
                        "typeString": "int_const 2"
                      },
                      "value": "2"
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_minus_2_by_1",
                      "typeString": "int_const -2"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3421,
                    "nodeType": "Block",
                    "src": "49513:95:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3419,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3403,
                            "name": "outNum",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3401,
                            "src": "49523:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "condition": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              },
                              "id": 3406,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 3404,
                                "name": "inNum",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3394,
                                "src": "49532:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 3405,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "49541:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "49532:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "falseExpression": {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "condition": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    },
                                    "id": 3413,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 3411,
                                      "name": "inNum",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3394,
                                      "src": "49563:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 3412,
                                      "name": "USE_VALUE1",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3387,
                                      "src": "49572:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_int256",
                                        "typeString": "int256"
                                      }
                                    },
                                    "src": "49563:19:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "falseExpression": {
                                    "argumentTypes": null,
                                    "id": 3415,
                                    "name": "value2",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3398,
                                    "src": "49594:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 3416,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "Conditional",
                                  "src": "49563:37:0",
                                  "trueExpression": {
                                    "argumentTypes": null,
                                    "id": 3414,
                                    "name": "value1",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3396,
                                    "src": "49585:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "id": 3417,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "49562:39:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 3418,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "Conditional",
                            "src": "49532:69:0",
                            "trueExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3409,
                                  "name": "inNum",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3394,
                                  "src": "49553:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                ],
                                "id": 3408,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "49545:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 3407,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "49545:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 3410,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "49545:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "49523:78:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3420,
                        "nodeType": "ExpressionStatement",
                        "src": "49523:78:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3392,
                    "nodeType": "StructuredDocumentation",
                    "src": "49279:100:0",
                    "text": "@dev Helper function for choosing the correct value (`value1` or `value2`) depending on `inNum`."
                  },
                  "id": 3422,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_num",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3399,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3394,
                        "mutability": "mutable",
                        "name": "inNum",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3422,
                        "src": "49407:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 3393,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49407:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3396,
                        "mutability": "mutable",
                        "name": "value1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3422,
                        "src": "49429:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3395,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49429:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3398,
                        "mutability": "mutable",
                        "name": "value2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3422,
                        "src": "49453:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3397,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49453:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49397:76:0"
                  },
                  "returnParameters": {
                    "id": 3402,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3401,
                        "mutability": "mutable",
                        "name": "outNum",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3422,
                        "src": "49497:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3400,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49497:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49496:16:0"
                  },
                  "scope": 4810,
                  "src": "49384:224:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3499,
                    "nodeType": "Block",
                    "src": "49838:385:0",
                    "statements": [
                      {
                        "assignments": [
                          3439,
                          3441,
                          3443,
                          3445
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3439,
                            "mutability": "mutable",
                            "name": "token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3499,
                            "src": "49849:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$1118",
                              "typeString": "contract IERC20"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 3438,
                              "name": "IERC20",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1118,
                              "src": "49849:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3441,
                            "mutability": "mutable",
                            "name": "to",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3499,
                            "src": "49863:10:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 3440,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "49863:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3443,
                            "mutability": "mutable",
                            "name": "amount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3499,
                            "src": "49875:13:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "typeName": {
                              "id": 3442,
                              "name": "int256",
                              "nodeType": "ElementaryTypeName",
                              "src": "49875:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3445,
                            "mutability": "mutable",
                            "name": "share",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3499,
                            "src": "49890:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "typeName": {
                              "id": 3444,
                              "name": "int256",
                              "nodeType": "ElementaryTypeName",
                              "src": "49890:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3458,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3448,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3425,
                              "src": "49917:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "id": 3449,
                                  "name": "IERC20",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1118,
                                  "src": "49924:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_IERC20_$1118_$",
                                    "typeString": "type(contract IERC20)"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3451,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "49932:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 3450,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "49932:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3453,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "49941:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_int256_$",
                                    "typeString": "type(int256)"
                                  },
                                  "typeName": {
                                    "id": 3452,
                                    "name": "int256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "49941:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3455,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "49949:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_int256_$",
                                    "typeString": "type(int256)"
                                  },
                                  "typeName": {
                                    "id": 3454,
                                    "name": "int256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "49949:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                }
                              ],
                              "id": 3456,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "49923:33:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_address_$_$_t_type$_t_int256_$_$_t_type$_t_int256_$_$",
                                "typeString": "tuple(type(contract IERC20),type(address),type(int256),type(int256))"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_address_$_$_t_type$_t_int256_$_$_t_type$_t_int256_$_$",
                                "typeString": "tuple(type(contract IERC20),type(address),type(int256),type(int256))"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3446,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "49906:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 3447,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "decode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "49906:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 3457,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "49906:51:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_contract$_IERC20_$1118_$_t_address_payable_$_t_int256_$_t_int256_$",
                            "typeString": "tuple(contract IERC20,address payable,int256,int256)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "49848:109:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3468,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3459,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3443,
                            "src": "49967:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 3463,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3443,
                                    "src": "49988:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 3464,
                                    "name": "value1",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3429,
                                    "src": "49996:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 3465,
                                    "name": "value2",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3431,
                                    "src": "50004:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 3462,
                                  "name": "_num",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3422,
                                  "src": "49983:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 3466,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "49983:28:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 3461,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "49976:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_int256_$",
                                "typeString": "type(int256)"
                              },
                              "typeName": {
                                "id": 3460,
                                "name": "int256",
                                "nodeType": "ElementaryTypeName",
                                "src": "49976:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 3467,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "49976:36:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            }
                          },
                          "src": "49967:45:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "id": 3469,
                        "nodeType": "ExpressionStatement",
                        "src": "49967:45:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3479,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3470,
                            "name": "share",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3445,
                            "src": "50070:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 3474,
                                    "name": "share",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3445,
                                    "src": "50090:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 3475,
                                    "name": "value1",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3429,
                                    "src": "50097:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 3476,
                                    "name": "value2",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3431,
                                    "src": "50105:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_int256",
                                      "typeString": "int256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 3473,
                                  "name": "_num",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3422,
                                  "src": "50085:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 3477,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "50085:27:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 3472,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "50078:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_int256_$",
                                "typeString": "type(int256)"
                              },
                              "typeName": {
                                "id": 3471,
                                "name": "int256",
                                "nodeType": "ElementaryTypeName",
                                "src": "50078:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 3478,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "50078:35:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            }
                          },
                          "src": "50070:43:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "id": 3480,
                        "nodeType": "ExpressionStatement",
                        "src": "50070:43:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3485,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3439,
                              "src": "50161:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3486,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "50168:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3487,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "50168:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3488,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3441,
                              "src": "50180:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3491,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3443,
                                  "src": "50192:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                ],
                                "id": 3490,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "50184:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 3489,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "50184:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 3492,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50184:15:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3495,
                                  "name": "share",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3445,
                                  "src": "50209:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                ],
                                "id": 3494,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "50201:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 3493,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "50201:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 3496,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50201:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                  "typeString": "contract IERC20"
                                },
                                {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3481,
                                "name": "bentoBox",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1983,
                                "src": "50130:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                  "typeString": "contract IBentoBoxV1"
                                }
                              },
                              "id": 3482,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "deposit",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1571,
                              "src": "50130:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_payable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                "typeString": "function (contract IERC20,address,address,uint256,uint256) payable external returns (uint256,uint256)"
                              }
                            },
                            "id": 3484,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "id": 3483,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3427,
                                "src": "50154:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "50130:30:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_payable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$value",
                              "typeString": "function (contract IERC20,address,address,uint256,uint256) payable external returns (uint256,uint256)"
                            }
                          },
                          "id": 3497,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50130:86:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                            "typeString": "tuple(uint256,uint256)"
                          }
                        },
                        "functionReturnParameters": 3437,
                        "id": 3498,
                        "nodeType": "Return",
                        "src": "50123:93:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3423,
                    "nodeType": "StructuredDocumentation",
                    "src": "49614:56:0",
                    "text": "@dev Helper function for depositing into `bentoBox`."
                  },
                  "id": 3500,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_bentoDeposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3432,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3425,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3500,
                        "src": "49707:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3424,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "49707:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3427,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3500,
                        "src": "49734:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3426,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49734:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3429,
                        "mutability": "mutable",
                        "name": "value1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3500,
                        "src": "49757:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3428,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49757:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3431,
                        "mutability": "mutable",
                        "name": "value2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3500,
                        "src": "49781:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3430,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49781:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49697:104:0"
                  },
                  "returnParameters": {
                    "id": 3437,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3434,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3500,
                        "src": "49820:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3433,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49820:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3436,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3500,
                        "src": "49829:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3435,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "49829:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49819:18:0"
                  },
                  "scope": 4810,
                  "src": "49675:548:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3553,
                    "nodeType": "Block",
                    "src": "50432:242:0",
                    "statements": [
                      {
                        "assignments": [
                          3515,
                          3517,
                          3519,
                          3521
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3515,
                            "mutability": "mutable",
                            "name": "token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3553,
                            "src": "50443:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$1118",
                              "typeString": "contract IERC20"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 3514,
                              "name": "IERC20",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1118,
                              "src": "50443:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3517,
                            "mutability": "mutable",
                            "name": "to",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3553,
                            "src": "50457:10:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 3516,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "50457:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3519,
                            "mutability": "mutable",
                            "name": "amount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3553,
                            "src": "50469:13:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "typeName": {
                              "id": 3518,
                              "name": "int256",
                              "nodeType": "ElementaryTypeName",
                              "src": "50469:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3521,
                            "mutability": "mutable",
                            "name": "share",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3553,
                            "src": "50484:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_int256",
                              "typeString": "int256"
                            },
                            "typeName": {
                              "id": 3520,
                              "name": "int256",
                              "nodeType": "ElementaryTypeName",
                              "src": "50484:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3534,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3524,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3503,
                              "src": "50511:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "id": 3525,
                                  "name": "IERC20",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1118,
                                  "src": "50518:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_IERC20_$1118_$",
                                    "typeString": "type(contract IERC20)"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3527,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "50526:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 3526,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "50526:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3529,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "50535:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_int256_$",
                                    "typeString": "type(int256)"
                                  },
                                  "typeName": {
                                    "id": 3528,
                                    "name": "int256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "50535:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3531,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "50543:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_int256_$",
                                    "typeString": "type(int256)"
                                  },
                                  "typeName": {
                                    "id": 3530,
                                    "name": "int256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "50543:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                }
                              ],
                              "id": 3532,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "50517:33:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_address_$_$_t_type$_t_int256_$_$_t_type$_t_int256_$_$",
                                "typeString": "tuple(type(contract IERC20),type(address),type(int256),type(int256))"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_address_$_$_t_type$_t_int256_$_$_t_type$_t_int256_$_$",
                                "typeString": "tuple(type(contract IERC20),type(address),type(int256),type(int256))"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3522,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "50500:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 3523,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "decode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "50500:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 3533,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50500:51:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_contract$_IERC20_$1118_$_t_address_payable_$_t_int256_$_t_int256_$",
                            "typeString": "tuple(contract IERC20,address payable,int256,int256)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "50442:109:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3537,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3515,
                              "src": "50586:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3538,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "50593:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 3539,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "50593:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3540,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3517,
                              "src": "50605:2:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3542,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3519,
                                  "src": "50614:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3543,
                                  "name": "value1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3505,
                                  "src": "50622:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3544,
                                  "name": "value2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3507,
                                  "src": "50630:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 3541,
                                "name": "_num",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3422,
                                "src": "50609:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                  "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 3545,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50609:28:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3547,
                                  "name": "share",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3521,
                                  "src": "50644:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3548,
                                  "name": "value1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3505,
                                  "src": "50651:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3549,
                                  "name": "value2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3507,
                                  "src": "50659:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 3546,
                                "name": "_num",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3422,
                                "src": "50639:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                  "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 3550,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50639:27:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3535,
                              "name": "bentoBox",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1983,
                              "src": "50568:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                "typeString": "contract IBentoBoxV1"
                              }
                            },
                            "id": 3536,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "withdraw",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1795,
                            "src": "50568:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                              "typeString": "function (contract IERC20,address,address,uint256,uint256) external returns (uint256,uint256)"
                            }
                          },
                          "id": 3551,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50568:99:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                            "typeString": "tuple(uint256,uint256)"
                          }
                        },
                        "functionReturnParameters": 3513,
                        "id": 3552,
                        "nodeType": "Return",
                        "src": "50561:106:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3501,
                    "nodeType": "StructuredDocumentation",
                    "src": "50229:57:0",
                    "text": "@dev Helper function to withdraw from the `bentoBox`."
                  },
                  "id": 3554,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_bentoWithdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3508,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3503,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3554,
                        "src": "50324:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3502,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "50324:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3505,
                        "mutability": "mutable",
                        "name": "value1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3554,
                        "src": "50351:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3504,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "50351:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3507,
                        "mutability": "mutable",
                        "name": "value2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3554,
                        "src": "50375:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3506,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "50375:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50314:81:0"
                  },
                  "returnParameters": {
                    "id": 3513,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3510,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3554,
                        "src": "50414:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3509,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "50414:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3512,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3554,
                        "src": "50423:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3511,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "50423:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50413:18:0"
                  },
                  "scope": 4810,
                  "src": "50291:383:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3675,
                    "nodeType": "Block",
                    "src": "51105:784:0",
                    "statements": [
                      {
                        "assignments": [
                          3571,
                          3573,
                          3575,
                          3577,
                          3579
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3571,
                            "mutability": "mutable",
                            "name": "callee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3675,
                            "src": "51116:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 3570,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "51116:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3573,
                            "mutability": "mutable",
                            "name": "callData",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3675,
                            "src": "51132:21:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 3572,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "51132:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3575,
                            "mutability": "mutable",
                            "name": "useValue1",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3675,
                            "src": "51155:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 3574,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "51155:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3577,
                            "mutability": "mutable",
                            "name": "useValue2",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3675,
                            "src": "51171:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 3576,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "51171:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3579,
                            "mutability": "mutable",
                            "name": "returnValues",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3675,
                            "src": "51187:18:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            },
                            "typeName": {
                              "id": 3578,
                              "name": "uint8",
                              "nodeType": "ElementaryTypeName",
                              "src": "51187:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3595,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3582,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3559,
                              "src": "51232:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "id": 3584,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "51239:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 3583,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "51239:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3586,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "51248:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                    "typeString": "type(bytes storage pointer)"
                                  },
                                  "typeName": {
                                    "id": 3585,
                                    "name": "bytes",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "51248:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3588,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "51255:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_bool_$",
                                    "typeString": "type(bool)"
                                  },
                                  "typeName": {
                                    "id": 3587,
                                    "name": "bool",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "51255:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3590,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "51261:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_bool_$",
                                    "typeString": "type(bool)"
                                  },
                                  "typeName": {
                                    "id": 3589,
                                    "name": "bool",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "51261:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3592,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "51267:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint8_$",
                                    "typeString": "type(uint8)"
                                  },
                                  "typeName": {
                                    "id": 3591,
                                    "name": "uint8",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "51267:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                }
                              ],
                              "id": 3593,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "51238:35:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_bytes_storage_ptr_$_$_t_type$_t_bool_$_$_t_type$_t_bool_$_$_t_type$_t_uint8_$_$",
                                "typeString": "tuple(type(address),type(bytes storage pointer),type(bool),type(bool),type(uint8))"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_bytes_storage_ptr_$_$_t_type$_t_bool_$_$_t_type$_t_bool_$_$_t_type$_t_uint8_$_$",
                                "typeString": "tuple(type(address),type(bytes storage pointer),type(bool),type(bool),type(uint8))"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3580,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "51221:3:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 3581,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "decode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "51221:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 3594,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51221:53:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_payable_$_t_bytes_memory_ptr_$_t_bool_$_t_bool_$_t_uint8_$",
                            "typeString": "tuple(address payable,bytes memory,bool,bool,uint8)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "51115:159:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 3599,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 3596,
                            "name": "useValue1",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3575,
                            "src": "51289:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 3598,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "!",
                            "prefix": true,
                            "src": "51302:10:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 3597,
                              "name": "useValue2",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3577,
                              "src": "51303:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "51289:23:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "id": 3612,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 3610,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "!",
                              "prefix": true,
                              "src": "51394:10:0",
                              "subExpression": {
                                "argumentTypes": null,
                                "id": 3609,
                                "name": "useValue1",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3575,
                                "src": "51395:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "&&",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 3611,
                              "name": "useValue2",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3577,
                              "src": "51408:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "src": "51394:23:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": {
                            "condition": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 3624,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 3622,
                                "name": "useValue1",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3575,
                                "src": "51499:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 3623,
                                "name": "useValue2",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3577,
                                "src": "51512:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "51499:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "falseBody": null,
                            "id": 3635,
                            "nodeType": "IfStatement",
                            "src": "51495:106:0",
                            "trueBody": {
                              "id": 3634,
                              "nodeType": "Block",
                              "src": "51523:78:0",
                              "statements": [
                                {
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3632,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 3625,
                                      "name": "callData",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3573,
                                      "src": "51537:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 3628,
                                          "name": "callData",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3573,
                                          "src": "51565:8:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 3629,
                                          "name": "value1",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3561,
                                          "src": "51575:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 3630,
                                          "name": "value2",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3563,
                                          "src": "51583:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 3626,
                                          "name": "abi",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -1,
                                          "src": "51548:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_abi",
                                            "typeString": "abi"
                                          }
                                        },
                                        "id": 3627,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "encodePacked",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "51548:16:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                          "typeString": "function () pure returns (bytes memory)"
                                        }
                                      },
                                      "id": 3631,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "51548:42:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                      }
                                    },
                                    "src": "51537:53:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  },
                                  "id": 3633,
                                  "nodeType": "ExpressionStatement",
                                  "src": "51537:53:0"
                                }
                              ]
                            }
                          },
                          "id": 3636,
                          "nodeType": "IfStatement",
                          "src": "51390:211:0",
                          "trueBody": {
                            "id": 3621,
                            "nodeType": "Block",
                            "src": "51419:70:0",
                            "statements": [
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3619,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "id": 3613,
                                    "name": "callData",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3573,
                                    "src": "51433:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 3616,
                                        "name": "callData",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3573,
                                        "src": "51461:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "id": 3617,
                                        "name": "value2",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3563,
                                        "src": "51471:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        },
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 3614,
                                        "name": "abi",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -1,
                                        "src": "51444:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_abi",
                                          "typeString": "abi"
                                        }
                                      },
                                      "id": 3615,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "memberName": "encodePacked",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "51444:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                        "typeString": "function () pure returns (bytes memory)"
                                      }
                                    },
                                    "id": 3618,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "51444:34:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  },
                                  "src": "51433:45:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "id": 3620,
                                "nodeType": "ExpressionStatement",
                                "src": "51433:45:0"
                              }
                            ]
                          }
                        },
                        "id": 3637,
                        "nodeType": "IfStatement",
                        "src": "51285:316:0",
                        "trueBody": {
                          "id": 3608,
                          "nodeType": "Block",
                          "src": "51314:70:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 3606,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 3600,
                                  "name": "callData",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3573,
                                  "src": "51328:8:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 3603,
                                      "name": "callData",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3573,
                                      "src": "51356:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 3604,
                                      "name": "value1",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3561,
                                      "src": "51366:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3601,
                                      "name": "abi",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -1,
                                      "src": "51339:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_abi",
                                        "typeString": "abi"
                                      }
                                    },
                                    "id": 3602,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "memberName": "encodePacked",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "51339:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                      "typeString": "function () pure returns (bytes memory)"
                                    }
                                  },
                                  "id": 3605,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "51339:34:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "src": "51328:45:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              },
                              "id": 3607,
                              "nodeType": "ExpressionStatement",
                              "src": "51328:45:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 3651,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 3644,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 3639,
                                  "name": "callee",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3571,
                                  "src": "51619:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 3642,
                                      "name": "bentoBox",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1983,
                                      "src": "51637:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                        "typeString": "contract IBentoBoxV1"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                        "typeString": "contract IBentoBoxV1"
                                      }
                                    ],
                                    "id": 3641,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "51629:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 3640,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "51629:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 3643,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "51629:17:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "51619:27:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 3650,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 3645,
                                  "name": "callee",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3571,
                                  "src": "51650:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 3648,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "51668:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                        "typeString": "contract KashiPairMediumRiskV1"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                        "typeString": "contract KashiPairMediumRiskV1"
                                      }
                                    ],
                                    "id": 3647,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "51660:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 3646,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "51660:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 3649,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "51660:13:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "51650:23:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "51619:54:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b61736869506169723a2063616e27742063616c6c",
                              "id": 3652,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "51675:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_850499ec04a05acf38c041fdeed6bafd86dcd15519b7c2d62f48fb1131d0e153",
                                "typeString": "literal_string \"KashiPair: can't call\""
                              },
                              "value": "KashiPair: can't call"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_850499ec04a05acf38c041fdeed6bafd86dcd15519b7c2d62f48fb1131d0e153",
                                "typeString": "literal_string \"KashiPair: can't call\""
                              }
                            ],
                            "id": 3638,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "51611:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3653,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51611:88:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3654,
                        "nodeType": "ExpressionStatement",
                        "src": "51611:88:0"
                      },
                      {
                        "assignments": [
                          3656,
                          3658
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3656,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3675,
                            "src": "51711:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 3655,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "51711:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3658,
                            "mutability": "mutable",
                            "name": "returnData",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3675,
                            "src": "51725:23:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 3657,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "51725:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3665,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3663,
                              "name": "callData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3573,
                              "src": "51778:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3659,
                                "name": "callee",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3571,
                                "src": "51752:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 3660,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "51752:11: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": 3662,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "id": 3661,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3557,
                                "src": "51771:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "51752:25: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": 3664,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51752:35:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "51710:77:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3667,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3656,
                              "src": "51805:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b61736869506169723a2063616c6c206661696c6564",
                              "id": 3668,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "51814:24:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_539c61cab6d5ea499d4d6225da0b87defab7855fb8bb8db078e0217971505de3",
                                "typeString": "literal_string \"KashiPair: call failed\""
                              },
                              "value": "KashiPair: call failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_539c61cab6d5ea499d4d6225da0b87defab7855fb8bb8db078e0217971505de3",
                                "typeString": "literal_string \"KashiPair: call failed\""
                              }
                            ],
                            "id": 3666,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "51797:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3669,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51797:42:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3670,
                        "nodeType": "ExpressionStatement",
                        "src": "51797:42:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 3671,
                              "name": "returnData",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3658,
                              "src": "51857:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3672,
                              "name": "returnValues",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3579,
                              "src": "51869:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            }
                          ],
                          "id": 3673,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "51856:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bytes_memory_ptr_$_t_uint8_$",
                            "typeString": "tuple(bytes memory,uint8)"
                          }
                        },
                        "functionReturnParameters": 3569,
                        "id": 3674,
                        "nodeType": "Return",
                        "src": "51849:33:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3555,
                    "nodeType": "StructuredDocumentation",
                    "src": "50680:262:0",
                    "text": "@dev Helper function to perform a contract call and eventually extracting revert messages on failure.\n Calls to `bentoBox` are not allowed for obvious security reasons.\n This also means that calls made from this contract shall *not* be trusted."
                  },
                  "id": 3676,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_call",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3564,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3557,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3676,
                        "src": "50971:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3556,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "50971:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3559,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3676,
                        "src": "50994:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3558,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "50994:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3561,
                        "mutability": "mutable",
                        "name": "value1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3676,
                        "src": "51021:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3560,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "51021:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3563,
                        "mutability": "mutable",
                        "name": "value2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3676,
                        "src": "51045:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3562,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "51045:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50961:104:0"
                  },
                  "returnParameters": {
                    "id": 3569,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3566,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3676,
                        "src": "51084:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3565,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "51084:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3568,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3676,
                        "src": "51098:5:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 3567,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "51098:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "51083:21:0"
                  },
                  "scope": 4810,
                  "src": "50947:942:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "canonicalName": "KashiPairMediumRiskV1.CookStatus",
                  "id": 3681,
                  "members": [
                    {
                      "constant": false,
                      "id": 3678,
                      "mutability": "mutable",
                      "name": "needsSolvencyCheck",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 3681,
                      "src": "51923:23:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 3677,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "51923:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 3680,
                      "mutability": "mutable",
                      "name": "hasAccrued",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 3681,
                      "src": "51956:15:0",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 3679,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "51956:4:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "CookStatus",
                  "nodeType": "StructDefinition",
                  "scope": 4810,
                  "src": "51895:83:0",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4300,
                    "nodeType": "Block",
                    "src": "52899:4254:0",
                    "statements": [
                      {
                        "assignments": [
                          3699
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3699,
                            "mutability": "mutable",
                            "name": "status",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4300,
                            "src": "52909:24:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CookStatus_$3681_memory_ptr",
                              "typeString": "struct KashiPairMediumRiskV1.CookStatus"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 3698,
                              "name": "CookStatus",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 3681,
                              "src": "52909:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CookStatus_$3681_storage_ptr",
                                "typeString": "struct KashiPairMediumRiskV1.CookStatus"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3700,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "52909:24:0"
                      },
                      {
                        "body": {
                          "id": 4284,
                          "nodeType": "Block",
                          "src": "52988:4012:0",
                          "statements": [
                            {
                              "assignments": [
                                3713
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 3713,
                                  "mutability": "mutable",
                                  "name": "action",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 4284,
                                  "src": "53002:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  },
                                  "typeName": {
                                    "id": 3712,
                                    "name": "uint8",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "53002:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 3717,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 3714,
                                  "name": "actions",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3685,
                                  "src": "53017:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_uint8_$dyn_calldata_ptr",
                                    "typeString": "uint8[] calldata"
                                  }
                                },
                                "id": 3716,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 3715,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3702,
                                  "src": "53025:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "53017:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "53002:25:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 3724,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 3720,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "UnaryOperation",
                                  "operator": "!",
                                  "prefix": true,
                                  "src": "53045:18:0",
                                  "subExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3718,
                                      "name": "status",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3699,
                                      "src": "53046:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_CookStatus_$3681_memory_ptr",
                                        "typeString": "struct KashiPairMediumRiskV1.CookStatus memory"
                                      }
                                    },
                                    "id": 3719,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "hasAccrued",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3680,
                                    "src": "53046:17:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "&&",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  },
                                  "id": 3723,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 3721,
                                    "name": "action",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3713,
                                    "src": "53067:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "<",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "3130",
                                    "id": 3722,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "53076:2:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_10_by_1",
                                      "typeString": "int_const 10"
                                    },
                                    "value": "10"
                                  },
                                  "src": "53067:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "53045:33:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 3735,
                              "nodeType": "IfStatement",
                              "src": "53041:122:0",
                              "trueBody": {
                                "id": 3734,
                                "nodeType": "Block",
                                "src": "53080:83:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "id": 3725,
                                        "name": "accrue",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2553,
                                        "src": "53098:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                                          "typeString": "function ()"
                                        }
                                      },
                                      "id": 3726,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "53098:8:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3727,
                                    "nodeType": "ExpressionStatement",
                                    "src": "53098:8:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3732,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 3728,
                                          "name": "status",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3699,
                                          "src": "53124:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_CookStatus_$3681_memory_ptr",
                                            "typeString": "struct KashiPairMediumRiskV1.CookStatus memory"
                                          }
                                        },
                                        "id": 3730,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "memberName": "hasAccrued",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 3680,
                                        "src": "53124:17:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "hexValue": "74727565",
                                        "id": 3731,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "bool",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "53144:4:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        "value": "true"
                                      },
                                      "src": "53124:24:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "id": 3733,
                                    "nodeType": "ExpressionStatement",
                                    "src": "53124:24:0"
                                  }
                                ]
                              }
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                },
                                "id": 3738,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 3736,
                                  "name": "action",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3713,
                                  "src": "53180:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 3737,
                                  "name": "ACTION_ADD_COLLATERAL",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3362,
                                  "src": "53190:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                "src": "53180:31:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  },
                                  "id": 3772,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 3770,
                                    "name": "action",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3713,
                                    "src": "53411:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "==",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 3771,
                                    "name": "ACTION_ADD_ASSET",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3338,
                                    "src": "53421:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  "src": "53411:26:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseBody": {
                                  "condition": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    "id": 3808,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 3806,
                                      "name": "action",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3713,
                                      "src": "53642:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 3807,
                                      "name": "ACTION_REPAY",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3341,
                                      "src": "53652:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    },
                                    "src": "53642:22:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "falseBody": {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      },
                                      "id": 3842,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 3840,
                                        "name": "action",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3713,
                                        "src": "53855:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint8",
                                          "typeString": "uint8"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "id": 3841,
                                        "name": "ACTION_REMOVE_ASSET",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3344,
                                        "src": "53865:19:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint8",
                                          "typeString": "uint8"
                                        }
                                      },
                                      "src": "53855:29:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": {
                                      "condition": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint8",
                                          "typeString": "uint8"
                                        },
                                        "id": 3873,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 3871,
                                          "name": "action",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3713,
                                          "src": "54075:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint8",
                                            "typeString": "uint8"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "==",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 3872,
                                          "name": "ACTION_REMOVE_COLLATERAL",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3347,
                                          "src": "54085:24:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint8",
                                            "typeString": "uint8"
                                          }
                                        },
                                        "src": "54075:34:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "falseBody": {
                                        "condition": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint8",
                                            "typeString": "uint8"
                                          },
                                          "id": 3908,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 3906,
                                            "name": "action",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3713,
                                            "src": "54340:6:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint8",
                                              "typeString": "uint8"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "==",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 3907,
                                            "name": "ACTION_BORROW",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3350,
                                            "src": "54350:13:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint8",
                                              "typeString": "uint8"
                                            }
                                          },
                                          "src": "54340:23:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "falseBody": {
                                          "condition": {
                                            "argumentTypes": null,
                                            "commonType": {
                                              "typeIdentifier": "t_uint8",
                                              "typeString": "uint8"
                                            },
                                            "id": 3947,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                              "argumentTypes": null,
                                              "id": 3945,
                                              "name": "action",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3713,
                                              "src": "54605:6:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint8",
                                                "typeString": "uint8"
                                              }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "==",
                                            "rightExpression": {
                                              "argumentTypes": null,
                                              "id": 3946,
                                              "name": "ACTION_UPDATE_EXCHANGE_RATE",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3365,
                                              "src": "54615:27:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint8",
                                                "typeString": "uint8"
                                              }
                                            },
                                            "src": "54605:37:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            }
                                          },
                                          "falseBody": {
                                            "condition": {
                                              "argumentTypes": null,
                                              "commonType": {
                                                "typeIdentifier": "t_uint8",
                                                "typeString": "uint8"
                                              },
                                              "id": 4000,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "leftExpression": {
                                                "argumentTypes": null,
                                                "id": 3998,
                                                "name": "action",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3713,
                                                "src": "54989:6:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint8",
                                                  "typeString": "uint8"
                                                }
                                              },
                                              "nodeType": "BinaryOperation",
                                              "operator": "==",
                                              "rightExpression": {
                                                "argumentTypes": null,
                                                "id": 3999,
                                                "name": "ACTION_BENTO_SETAPPROVAL",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3380,
                                                "src": "54999:24:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint8",
                                                  "typeString": "uint8"
                                                }
                                              },
                                              "src": "54989:34:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              }
                                            },
                                            "falseBody": {
                                              "condition": {
                                                "argumentTypes": null,
                                                "commonType": {
                                                  "typeIdentifier": "t_uint8",
                                                  "typeString": "uint8"
                                                },
                                                "id": 4047,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                  "argumentTypes": null,
                                                  "id": 4045,
                                                  "name": "action",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3713,
                                                  "src": "55341:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint8",
                                                    "typeString": "uint8"
                                                  }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "==",
                                                "rightExpression": {
                                                  "argumentTypes": null,
                                                  "id": 4046,
                                                  "name": "ACTION_BENTO_DEPOSIT",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3368,
                                                  "src": "55351:20:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint8",
                                                    "typeString": "uint8"
                                                  }
                                                },
                                                "src": "55341:30:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                }
                                              },
                                              "falseBody": {
                                                "condition": {
                                                  "argumentTypes": null,
                                                  "commonType": {
                                                    "typeIdentifier": "t_uint8",
                                                    "typeString": "uint8"
                                                  },
                                                  "id": 4066,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "leftExpression": {
                                                    "argumentTypes": null,
                                                    "id": 4064,
                                                    "name": "action",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 3713,
                                                    "src": "55485:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint8",
                                                      "typeString": "uint8"
                                                    }
                                                  },
                                                  "nodeType": "BinaryOperation",
                                                  "operator": "==",
                                                  "rightExpression": {
                                                    "argumentTypes": null,
                                                    "id": 4065,
                                                    "name": "ACTION_BENTO_WITHDRAW",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 3371,
                                                    "src": "55495:21:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint8",
                                                      "typeString": "uint8"
                                                    }
                                                  },
                                                  "src": "55485:31:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                  }
                                                },
                                                "falseBody": {
                                                  "condition": {
                                                    "argumentTypes": null,
                                                    "commonType": {
                                                      "typeIdentifier": "t_uint8",
                                                      "typeString": "uint8"
                                                    },
                                                    "id": 4082,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "leftExpression": {
                                                      "argumentTypes": null,
                                                      "id": 4080,
                                                      "name": "action",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3713,
                                                      "src": "55620:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint8",
                                                        "typeString": "uint8"
                                                      }
                                                    },
                                                    "nodeType": "BinaryOperation",
                                                    "operator": "==",
                                                    "rightExpression": {
                                                      "argumentTypes": null,
                                                      "id": 4081,
                                                      "name": "ACTION_BENTO_TRANSFER",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3374,
                                                      "src": "55630:21:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint8",
                                                        "typeString": "uint8"
                                                      }
                                                    },
                                                    "src": "55620:31:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_bool",
                                                      "typeString": "bool"
                                                    }
                                                  },
                                                  "falseBody": {
                                                    "condition": {
                                                      "argumentTypes": null,
                                                      "commonType": {
                                                        "typeIdentifier": "t_uint8",
                                                        "typeString": "uint8"
                                                      },
                                                      "id": 4119,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "leftExpression": {
                                                        "argumentTypes": null,
                                                        "id": 4117,
                                                        "name": "action",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 3713,
                                                        "src": "55873:6:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint8",
                                                          "typeString": "uint8"
                                                        }
                                                      },
                                                      "nodeType": "BinaryOperation",
                                                      "operator": "==",
                                                      "rightExpression": {
                                                        "argumentTypes": null,
                                                        "id": 4118,
                                                        "name": "ACTION_BENTO_TRANSFER_MULTIPLE",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 3377,
                                                        "src": "55883:30:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint8",
                                                          "typeString": "uint8"
                                                        }
                                                      },
                                                      "src": "55873:40:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                      }
                                                    },
                                                    "falseBody": {
                                                      "condition": {
                                                        "argumentTypes": null,
                                                        "commonType": {
                                                          "typeIdentifier": "t_uint8",
                                                          "typeString": "uint8"
                                                        },
                                                        "id": 4156,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "leftExpression": {
                                                          "argumentTypes": null,
                                                          "id": 4154,
                                                          "name": "action",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 3713,
                                                          "src": "56149:6:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_uint8",
                                                            "typeString": "uint8"
                                                          }
                                                        },
                                                        "nodeType": "BinaryOperation",
                                                        "operator": "==",
                                                        "rightExpression": {
                                                          "argumentTypes": null,
                                                          "id": 4155,
                                                          "name": "ACTION_CALL",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 3383,
                                                          "src": "56159:11:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_uint8",
                                                            "typeString": "uint8"
                                                          }
                                                        },
                                                        "src": "56149:21:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bool",
                                                          "typeString": "bool"
                                                        }
                                                      },
                                                      "falseBody": {
                                                        "condition": {
                                                          "argumentTypes": null,
                                                          "commonType": {
                                                            "typeIdentifier": "t_uint8",
                                                            "typeString": "uint8"
                                                          },
                                                          "id": 4210,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": false,
                                                          "lValueRequested": false,
                                                          "leftExpression": {
                                                            "argumentTypes": null,
                                                            "id": 4208,
                                                            "name": "action",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3713,
                                                            "src": "56562:6:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint8",
                                                              "typeString": "uint8"
                                                            }
                                                          },
                                                          "nodeType": "BinaryOperation",
                                                          "operator": "==",
                                                          "rightExpression": {
                                                            "argumentTypes": null,
                                                            "id": 4209,
                                                            "name": "ACTION_GET_REPAY_SHARE",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3353,
                                                            "src": "56572:22:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint8",
                                                              "typeString": "uint8"
                                                            }
                                                          },
                                                          "src": "56562:32:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_bool",
                                                            "typeString": "bool"
                                                          }
                                                        },
                                                        "falseBody": {
                                                          "condition": {
                                                            "argumentTypes": null,
                                                            "commonType": {
                                                              "typeIdentifier": "t_uint8",
                                                              "typeString": "uint8"
                                                            },
                                                            "id": 4243,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "leftExpression": {
                                                              "argumentTypes": null,
                                                              "id": 4241,
                                                              "name": "action",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3713,
                                                              "src": "56796:6:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint8",
                                                                "typeString": "uint8"
                                                              }
                                                            },
                                                            "nodeType": "BinaryOperation",
                                                            "operator": "==",
                                                            "rightExpression": {
                                                              "argumentTypes": null,
                                                              "id": 4242,
                                                              "name": "ACTION_GET_REPAY_PART",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3356,
                                                              "src": "56806:21:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint8",
                                                                "typeString": "uint8"
                                                              }
                                                            },
                                                            "src": "56796:31:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_bool",
                                                              "typeString": "bool"
                                                            }
                                                          },
                                                          "falseBody": null,
                                                          "id": 4269,
                                                          "nodeType": "IfStatement",
                                                          "src": "56792:198:0",
                                                          "trueBody": {
                                                            "id": 4268,
                                                            "nodeType": "Block",
                                                            "src": "56829:161:0",
                                                            "statements": [
                                                              {
                                                                "assignments": [
                                                                  4245
                                                                ],
                                                                "declarations": [
                                                                  {
                                                                    "constant": false,
                                                                    "id": 4245,
                                                                    "mutability": "mutable",
                                                                    "name": "amount",
                                                                    "nodeType": "VariableDeclaration",
                                                                    "overrides": null,
                                                                    "scope": 4268,
                                                                    "src": "56847:13:0",
                                                                    "stateVariable": false,
                                                                    "storageLocation": "default",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_int256",
                                                                      "typeString": "int256"
                                                                    },
                                                                    "typeName": {
                                                                      "id": 4244,
                                                                      "name": "int256",
                                                                      "nodeType": "ElementaryTypeName",
                                                                      "src": "56847:6:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_int256",
                                                                        "typeString": "int256"
                                                                      }
                                                                    },
                                                                    "value": null,
                                                                    "visibility": "internal"
                                                                  }
                                                                ],
                                                                "id": 4255,
                                                                "initialValue": {
                                                                  "argumentTypes": null,
                                                                  "arguments": [
                                                                    {
                                                                      "argumentTypes": null,
                                                                      "baseExpression": {
                                                                        "argumentTypes": null,
                                                                        "id": 4248,
                                                                        "name": "datas",
                                                                        "nodeType": "Identifier",
                                                                        "overloadedDeclarations": [],
                                                                        "referencedDeclaration": 3691,
                                                                        "src": "56874:5:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                                          "typeString": "bytes calldata[] calldata"
                                                                        }
                                                                      },
                                                                      "id": 4250,
                                                                      "indexExpression": {
                                                                        "argumentTypes": null,
                                                                        "id": 4249,
                                                                        "name": "i",
                                                                        "nodeType": "Identifier",
                                                                        "overloadedDeclarations": [],
                                                                        "referencedDeclaration": 3702,
                                                                        "src": "56880:1:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_uint256",
                                                                          "typeString": "uint256"
                                                                        }
                                                                      },
                                                                      "isConstant": false,
                                                                      "isLValue": false,
                                                                      "isPure": false,
                                                                      "lValueRequested": false,
                                                                      "nodeType": "IndexAccess",
                                                                      "src": "56874:8:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                                        "typeString": "bytes calldata"
                                                                      }
                                                                    },
                                                                    {
                                                                      "argumentTypes": null,
                                                                      "components": [
                                                                        {
                                                                          "argumentTypes": null,
                                                                          "id": 4252,
                                                                          "isConstant": false,
                                                                          "isLValue": false,
                                                                          "isPure": true,
                                                                          "lValueRequested": false,
                                                                          "nodeType": "ElementaryTypeNameExpression",
                                                                          "src": "56885:6:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_type$_t_int256_$",
                                                                            "typeString": "type(int256)"
                                                                          },
                                                                          "typeName": {
                                                                            "id": 4251,
                                                                            "name": "int256",
                                                                            "nodeType": "ElementaryTypeName",
                                                                            "src": "56885:6:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": null,
                                                                              "typeString": null
                                                                            }
                                                                          }
                                                                        }
                                                                      ],
                                                                      "id": 4253,
                                                                      "isConstant": false,
                                                                      "isInlineArray": false,
                                                                      "isLValue": false,
                                                                      "isPure": true,
                                                                      "lValueRequested": false,
                                                                      "nodeType": "TupleExpression",
                                                                      "src": "56884:8:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_int256_$",
                                                                        "typeString": "type(int256)"
                                                                      }
                                                                    }
                                                                  ],
                                                                  "expression": {
                                                                    "argumentTypes": [
                                                                      {
                                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                                        "typeString": "bytes calldata"
                                                                      },
                                                                      {
                                                                        "typeIdentifier": "t_type$_t_int256_$",
                                                                        "typeString": "type(int256)"
                                                                      }
                                                                    ],
                                                                    "expression": {
                                                                      "argumentTypes": null,
                                                                      "id": 4246,
                                                                      "name": "abi",
                                                                      "nodeType": "Identifier",
                                                                      "overloadedDeclarations": [],
                                                                      "referencedDeclaration": -1,
                                                                      "src": "56863:3:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_magic_abi",
                                                                        "typeString": "abi"
                                                                      }
                                                                    },
                                                                    "id": 4247,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": true,
                                                                    "lValueRequested": false,
                                                                    "memberName": "decode",
                                                                    "nodeType": "MemberAccess",
                                                                    "referencedDeclaration": null,
                                                                    "src": "56863:10:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                                      "typeString": "function () pure"
                                                                    }
                                                                  },
                                                                  "id": 4254,
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": false,
                                                                  "kind": "functionCall",
                                                                  "lValueRequested": false,
                                                                  "names": [],
                                                                  "nodeType": "FunctionCall",
                                                                  "src": "56863:30:0",
                                                                  "tryCall": false,
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_int256",
                                                                    "typeString": "int256"
                                                                  }
                                                                },
                                                                "nodeType": "VariableDeclarationStatement",
                                                                "src": "56847:46:0"
                                                              },
                                                              {
                                                                "expression": {
                                                                  "argumentTypes": null,
                                                                  "id": 4266,
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": false,
                                                                  "lValueRequested": false,
                                                                  "leftHandSide": {
                                                                    "argumentTypes": null,
                                                                    "id": 4256,
                                                                    "name": "value1",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 3694,
                                                                    "src": "56911:6:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_uint256",
                                                                      "typeString": "uint256"
                                                                    }
                                                                  },
                                                                  "nodeType": "Assignment",
                                                                  "operator": "=",
                                                                  "rightHandSide": {
                                                                    "argumentTypes": null,
                                                                    "arguments": [
                                                                      {
                                                                        "argumentTypes": null,
                                                                        "arguments": [
                                                                          {
                                                                            "argumentTypes": null,
                                                                            "id": 4260,
                                                                            "name": "amount",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 4245,
                                                                            "src": "56944:6:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_int256",
                                                                              "typeString": "int256"
                                                                            }
                                                                          },
                                                                          {
                                                                            "argumentTypes": null,
                                                                            "id": 4261,
                                                                            "name": "value1",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 3694,
                                                                            "src": "56952:6:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_uint256",
                                                                              "typeString": "uint256"
                                                                            }
                                                                          },
                                                                          {
                                                                            "argumentTypes": null,
                                                                            "id": 4262,
                                                                            "name": "value2",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 3696,
                                                                            "src": "56960:6:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_uint256",
                                                                              "typeString": "uint256"
                                                                            }
                                                                          }
                                                                        ],
                                                                        "expression": {
                                                                          "argumentTypes": [
                                                                            {
                                                                              "typeIdentifier": "t_int256",
                                                                              "typeString": "int256"
                                                                            },
                                                                            {
                                                                              "typeIdentifier": "t_uint256",
                                                                              "typeString": "uint256"
                                                                            },
                                                                            {
                                                                              "typeIdentifier": "t_uint256",
                                                                              "typeString": "uint256"
                                                                            }
                                                                          ],
                                                                          "id": 4259,
                                                                          "name": "_num",
                                                                          "nodeType": "Identifier",
                                                                          "overloadedDeclarations": [],
                                                                          "referencedDeclaration": 3422,
                                                                          "src": "56939:4:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                                                            "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                                                          }
                                                                        },
                                                                        "id": 4263,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": false,
                                                                        "kind": "functionCall",
                                                                        "lValueRequested": false,
                                                                        "names": [],
                                                                        "nodeType": "FunctionCall",
                                                                        "src": "56939:28:0",
                                                                        "tryCall": false,
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_uint256",
                                                                          "typeString": "uint256"
                                                                        }
                                                                      },
                                                                      {
                                                                        "argumentTypes": null,
                                                                        "hexValue": "66616c7365",
                                                                        "id": 4264,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": true,
                                                                        "kind": "bool",
                                                                        "lValueRequested": false,
                                                                        "nodeType": "Literal",
                                                                        "src": "56969: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": 4257,
                                                                        "name": "totalBorrow",
                                                                        "nodeType": "Identifier",
                                                                        "overloadedDeclarations": [],
                                                                        "referencedDeclaration": 2005,
                                                                        "src": "56920:11:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                                                          "typeString": "struct Rebase storage ref"
                                                                        }
                                                                      },
                                                                      "id": 4258,
                                                                      "isConstant": false,
                                                                      "isLValue": true,
                                                                      "isPure": false,
                                                                      "lValueRequested": false,
                                                                      "memberName": "toBase",
                                                                      "nodeType": "MemberAccess",
                                                                      "referencedDeclaration": 816,
                                                                      "src": "56920:18:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$753_memory_ptr_$",
                                                                        "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                                                      }
                                                                    },
                                                                    "id": 4265,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": false,
                                                                    "kind": "functionCall",
                                                                    "lValueRequested": false,
                                                                    "names": [],
                                                                    "nodeType": "FunctionCall",
                                                                    "src": "56920:55:0",
                                                                    "tryCall": false,
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_uint256",
                                                                      "typeString": "uint256"
                                                                    }
                                                                  },
                                                                  "src": "56911:64:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                },
                                                                "id": 4267,
                                                                "nodeType": "ExpressionStatement",
                                                                "src": "56911:64:0"
                                                              }
                                                            ]
                                                          }
                                                        },
                                                        "id": 4270,
                                                        "nodeType": "IfStatement",
                                                        "src": "56558:432:0",
                                                        "trueBody": {
                                                          "id": 4240,
                                                          "nodeType": "Block",
                                                          "src": "56596:190:0",
                                                          "statements": [
                                                            {
                                                              "assignments": [
                                                                4212
                                                              ],
                                                              "declarations": [
                                                                {
                                                                  "constant": false,
                                                                  "id": 4212,
                                                                  "mutability": "mutable",
                                                                  "name": "part",
                                                                  "nodeType": "VariableDeclaration",
                                                                  "overrides": null,
                                                                  "scope": 4240,
                                                                  "src": "56614:11:0",
                                                                  "stateVariable": false,
                                                                  "storageLocation": "default",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_int256",
                                                                    "typeString": "int256"
                                                                  },
                                                                  "typeName": {
                                                                    "id": 4211,
                                                                    "name": "int256",
                                                                    "nodeType": "ElementaryTypeName",
                                                                    "src": "56614:6:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_int256",
                                                                      "typeString": "int256"
                                                                    }
                                                                  },
                                                                  "value": null,
                                                                  "visibility": "internal"
                                                                }
                                                              ],
                                                              "id": 4222,
                                                              "initialValue": {
                                                                "argumentTypes": null,
                                                                "arguments": [
                                                                  {
                                                                    "argumentTypes": null,
                                                                    "baseExpression": {
                                                                      "argumentTypes": null,
                                                                      "id": 4215,
                                                                      "name": "datas",
                                                                      "nodeType": "Identifier",
                                                                      "overloadedDeclarations": [],
                                                                      "referencedDeclaration": 3691,
                                                                      "src": "56639:5:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                                        "typeString": "bytes calldata[] calldata"
                                                                      }
                                                                    },
                                                                    "id": 4217,
                                                                    "indexExpression": {
                                                                      "argumentTypes": null,
                                                                      "id": 4216,
                                                                      "name": "i",
                                                                      "nodeType": "Identifier",
                                                                      "overloadedDeclarations": [],
                                                                      "referencedDeclaration": 3702,
                                                                      "src": "56645:1:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_uint256",
                                                                        "typeString": "uint256"
                                                                      }
                                                                    },
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": false,
                                                                    "lValueRequested": false,
                                                                    "nodeType": "IndexAccess",
                                                                    "src": "56639:8:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                                                      "typeString": "bytes calldata"
                                                                    }
                                                                  },
                                                                  {
                                                                    "argumentTypes": null,
                                                                    "components": [
                                                                      {
                                                                        "argumentTypes": null,
                                                                        "id": 4219,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": true,
                                                                        "lValueRequested": false,
                                                                        "nodeType": "ElementaryTypeNameExpression",
                                                                        "src": "56650:6:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_type$_t_int256_$",
                                                                          "typeString": "type(int256)"
                                                                        },
                                                                        "typeName": {
                                                                          "id": 4218,
                                                                          "name": "int256",
                                                                          "nodeType": "ElementaryTypeName",
                                                                          "src": "56650:6:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": null,
                                                                            "typeString": null
                                                                          }
                                                                        }
                                                                      }
                                                                    ],
                                                                    "id": 4220,
                                                                    "isConstant": false,
                                                                    "isInlineArray": false,
                                                                    "isLValue": false,
                                                                    "isPure": true,
                                                                    "lValueRequested": false,
                                                                    "nodeType": "TupleExpression",
                                                                    "src": "56649:8:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_type$_t_int256_$",
                                                                      "typeString": "type(int256)"
                                                                    }
                                                                  }
                                                                ],
                                                                "expression": {
                                                                  "argumentTypes": [
                                                                    {
                                                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                                                      "typeString": "bytes calldata"
                                                                    },
                                                                    {
                                                                      "typeIdentifier": "t_type$_t_int256_$",
                                                                      "typeString": "type(int256)"
                                                                    }
                                                                  ],
                                                                  "expression": {
                                                                    "argumentTypes": null,
                                                                    "id": 4213,
                                                                    "name": "abi",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": -1,
                                                                    "src": "56628:3:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_magic_abi",
                                                                      "typeString": "abi"
                                                                    }
                                                                  },
                                                                  "id": 4214,
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": true,
                                                                  "lValueRequested": false,
                                                                  "memberName": "decode",
                                                                  "nodeType": "MemberAccess",
                                                                  "referencedDeclaration": null,
                                                                  "src": "56628:10:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                                    "typeString": "function () pure"
                                                                  }
                                                                },
                                                                "id": 4221,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "kind": "functionCall",
                                                                "lValueRequested": false,
                                                                "names": [],
                                                                "nodeType": "FunctionCall",
                                                                "src": "56628:30:0",
                                                                "tryCall": false,
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_int256",
                                                                  "typeString": "int256"
                                                                }
                                                              },
                                                              "nodeType": "VariableDeclarationStatement",
                                                              "src": "56614:44:0"
                                                            },
                                                            {
                                                              "expression": {
                                                                "argumentTypes": null,
                                                                "id": 4238,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "leftHandSide": {
                                                                  "argumentTypes": null,
                                                                  "id": 4223,
                                                                  "name": "value1",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 3694,
                                                                  "src": "56676:6:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                },
                                                                "nodeType": "Assignment",
                                                                "operator": "=",
                                                                "rightHandSide": {
                                                                  "argumentTypes": null,
                                                                  "arguments": [
                                                                    {
                                                                      "argumentTypes": null,
                                                                      "id": 4226,
                                                                      "name": "asset",
                                                                      "nodeType": "Identifier",
                                                                      "overloadedDeclarations": [],
                                                                      "referencedDeclaration": 1995,
                                                                      "src": "56702:5:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                        "typeString": "contract IERC20"
                                                                      }
                                                                    },
                                                                    {
                                                                      "argumentTypes": null,
                                                                      "arguments": [
                                                                        {
                                                                          "argumentTypes": null,
                                                                          "arguments": [
                                                                            {
                                                                              "argumentTypes": null,
                                                                              "id": 4230,
                                                                              "name": "part",
                                                                              "nodeType": "Identifier",
                                                                              "overloadedDeclarations": [],
                                                                              "referencedDeclaration": 4212,
                                                                              "src": "56736:4:0",
                                                                              "typeDescriptions": {
                                                                                "typeIdentifier": "t_int256",
                                                                                "typeString": "int256"
                                                                              }
                                                                            },
                                                                            {
                                                                              "argumentTypes": null,
                                                                              "id": 4231,
                                                                              "name": "value1",
                                                                              "nodeType": "Identifier",
                                                                              "overloadedDeclarations": [],
                                                                              "referencedDeclaration": 3694,
                                                                              "src": "56742:6:0",
                                                                              "typeDescriptions": {
                                                                                "typeIdentifier": "t_uint256",
                                                                                "typeString": "uint256"
                                                                              }
                                                                            },
                                                                            {
                                                                              "argumentTypes": null,
                                                                              "id": 4232,
                                                                              "name": "value2",
                                                                              "nodeType": "Identifier",
                                                                              "overloadedDeclarations": [],
                                                                              "referencedDeclaration": 3696,
                                                                              "src": "56750:6:0",
                                                                              "typeDescriptions": {
                                                                                "typeIdentifier": "t_uint256",
                                                                                "typeString": "uint256"
                                                                              }
                                                                            }
                                                                          ],
                                                                          "expression": {
                                                                            "argumentTypes": [
                                                                              {
                                                                                "typeIdentifier": "t_int256",
                                                                                "typeString": "int256"
                                                                              },
                                                                              {
                                                                                "typeIdentifier": "t_uint256",
                                                                                "typeString": "uint256"
                                                                              },
                                                                              {
                                                                                "typeIdentifier": "t_uint256",
                                                                                "typeString": "uint256"
                                                                              }
                                                                            ],
                                                                            "id": 4229,
                                                                            "name": "_num",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 3422,
                                                                            "src": "56731:4:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                                                              "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                                                            }
                                                                          },
                                                                          "id": 4233,
                                                                          "isConstant": false,
                                                                          "isLValue": false,
                                                                          "isPure": false,
                                                                          "kind": "functionCall",
                                                                          "lValueRequested": false,
                                                                          "names": [],
                                                                          "nodeType": "FunctionCall",
                                                                          "src": "56731:26:0",
                                                                          "tryCall": false,
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_uint256",
                                                                            "typeString": "uint256"
                                                                          }
                                                                        },
                                                                        {
                                                                          "argumentTypes": null,
                                                                          "hexValue": "74727565",
                                                                          "id": 4234,
                                                                          "isConstant": false,
                                                                          "isLValue": false,
                                                                          "isPure": true,
                                                                          "kind": "bool",
                                                                          "lValueRequested": false,
                                                                          "nodeType": "Literal",
                                                                          "src": "56759: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": 4227,
                                                                          "name": "totalBorrow",
                                                                          "nodeType": "Identifier",
                                                                          "overloadedDeclarations": [],
                                                                          "referencedDeclaration": 2005,
                                                                          "src": "56709:11:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                                                            "typeString": "struct Rebase storage ref"
                                                                          }
                                                                        },
                                                                        "id": 4228,
                                                                        "isConstant": false,
                                                                        "isLValue": true,
                                                                        "isPure": false,
                                                                        "lValueRequested": false,
                                                                        "memberName": "toElastic",
                                                                        "nodeType": "MemberAccess",
                                                                        "referencedDeclaration": 872,
                                                                        "src": "56709:21:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$753_memory_ptr_$",
                                                                          "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                                                        }
                                                                      },
                                                                      "id": 4235,
                                                                      "isConstant": false,
                                                                      "isLValue": false,
                                                                      "isPure": false,
                                                                      "kind": "functionCall",
                                                                      "lValueRequested": false,
                                                                      "names": [],
                                                                      "nodeType": "FunctionCall",
                                                                      "src": "56709:55:0",
                                                                      "tryCall": false,
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_uint256",
                                                                        "typeString": "uint256"
                                                                      }
                                                                    },
                                                                    {
                                                                      "argumentTypes": null,
                                                                      "hexValue": "74727565",
                                                                      "id": 4236,
                                                                      "isConstant": false,
                                                                      "isLValue": false,
                                                                      "isPure": true,
                                                                      "kind": "bool",
                                                                      "lValueRequested": false,
                                                                      "nodeType": "Literal",
                                                                      "src": "56766:4:0",
                                                                      "subdenomination": null,
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_bool",
                                                                        "typeString": "bool"
                                                                      },
                                                                      "value": "true"
                                                                    }
                                                                  ],
                                                                  "expression": {
                                                                    "argumentTypes": [
                                                                      {
                                                                        "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                        "typeString": "contract IERC20"
                                                                      },
                                                                      {
                                                                        "typeIdentifier": "t_uint256",
                                                                        "typeString": "uint256"
                                                                      },
                                                                      {
                                                                        "typeIdentifier": "t_bool",
                                                                        "typeString": "bool"
                                                                      }
                                                                    ],
                                                                    "expression": {
                                                                      "argumentTypes": null,
                                                                      "id": 4224,
                                                                      "name": "bentoBox",
                                                                      "nodeType": "Identifier",
                                                                      "overloadedDeclarations": [],
                                                                      "referencedDeclaration": 1983,
                                                                      "src": "56685:8:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                                                        "typeString": "contract IBentoBoxV1"
                                                                      }
                                                                    },
                                                                    "id": 4225,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": false,
                                                                    "lValueRequested": false,
                                                                    "memberName": "toShare",
                                                                    "nodeType": "MemberAccess",
                                                                    "referencedDeclaration": 1724,
                                                                    "src": "56685:16:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                                                                      "typeString": "function (contract IERC20,uint256,bool) view external returns (uint256)"
                                                                    }
                                                                  },
                                                                  "id": 4237,
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": false,
                                                                  "kind": "functionCall",
                                                                  "lValueRequested": false,
                                                                  "names": [],
                                                                  "nodeType": "FunctionCall",
                                                                  "src": "56685:86:0",
                                                                  "tryCall": false,
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                },
                                                                "src": "56676:95:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_uint256",
                                                                  "typeString": "uint256"
                                                                }
                                                              },
                                                              "id": 4239,
                                                              "nodeType": "ExpressionStatement",
                                                              "src": "56676:95:0"
                                                            }
                                                          ]
                                                        }
                                                      },
                                                      "id": 4271,
                                                      "nodeType": "IfStatement",
                                                      "src": "56145:845:0",
                                                      "trueBody": {
                                                        "id": 4207,
                                                        "nodeType": "Block",
                                                        "src": "56172:380:0",
                                                        "statements": [
                                                          {
                                                            "assignments": [
                                                              4158,
                                                              4160
                                                            ],
                                                            "declarations": [
                                                              {
                                                                "constant": false,
                                                                "id": 4158,
                                                                "mutability": "mutable",
                                                                "name": "returnData",
                                                                "nodeType": "VariableDeclaration",
                                                                "overrides": null,
                                                                "scope": 4207,
                                                                "src": "56191:23:0",
                                                                "stateVariable": false,
                                                                "storageLocation": "memory",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_bytes_memory_ptr",
                                                                  "typeString": "bytes"
                                                                },
                                                                "typeName": {
                                                                  "id": 4157,
                                                                  "name": "bytes",
                                                                  "nodeType": "ElementaryTypeName",
                                                                  "src": "56191:5:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_storage_ptr",
                                                                    "typeString": "bytes"
                                                                  }
                                                                },
                                                                "value": null,
                                                                "visibility": "internal"
                                                              },
                                                              {
                                                                "constant": false,
                                                                "id": 4160,
                                                                "mutability": "mutable",
                                                                "name": "returnValues",
                                                                "nodeType": "VariableDeclaration",
                                                                "overrides": null,
                                                                "scope": 4207,
                                                                "src": "56216:18:0",
                                                                "stateVariable": false,
                                                                "storageLocation": "default",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_uint8",
                                                                  "typeString": "uint8"
                                                                },
                                                                "typeName": {
                                                                  "id": 4159,
                                                                  "name": "uint8",
                                                                  "nodeType": "ElementaryTypeName",
                                                                  "src": "56216:5:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint8",
                                                                    "typeString": "uint8"
                                                                  }
                                                                },
                                                                "value": null,
                                                                "visibility": "internal"
                                                              }
                                                            ],
                                                            "id": 4171,
                                                            "initialValue": {
                                                              "argumentTypes": null,
                                                              "arguments": [
                                                                {
                                                                  "argumentTypes": null,
                                                                  "baseExpression": {
                                                                    "argumentTypes": null,
                                                                    "id": 4162,
                                                                    "name": "values",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 3688,
                                                                    "src": "56244:6:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                                                      "typeString": "uint256[] calldata"
                                                                    }
                                                                  },
                                                                  "id": 4164,
                                                                  "indexExpression": {
                                                                    "argumentTypes": null,
                                                                    "id": 4163,
                                                                    "name": "i",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 3702,
                                                                    "src": "56251:1:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_uint256",
                                                                      "typeString": "uint256"
                                                                    }
                                                                  },
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": false,
                                                                  "lValueRequested": false,
                                                                  "nodeType": "IndexAccess",
                                                                  "src": "56244:9:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                },
                                                                {
                                                                  "argumentTypes": null,
                                                                  "baseExpression": {
                                                                    "argumentTypes": null,
                                                                    "id": 4165,
                                                                    "name": "datas",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 3691,
                                                                    "src": "56255:5:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                                      "typeString": "bytes calldata[] calldata"
                                                                    }
                                                                  },
                                                                  "id": 4167,
                                                                  "indexExpression": {
                                                                    "argumentTypes": null,
                                                                    "id": 4166,
                                                                    "name": "i",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 3702,
                                                                    "src": "56261:1:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_uint256",
                                                                      "typeString": "uint256"
                                                                    }
                                                                  },
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": false,
                                                                  "lValueRequested": false,
                                                                  "nodeType": "IndexAccess",
                                                                  "src": "56255:8:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                                    "typeString": "bytes calldata"
                                                                  }
                                                                },
                                                                {
                                                                  "argumentTypes": null,
                                                                  "id": 4168,
                                                                  "name": "value1",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 3694,
                                                                  "src": "56265:6:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                },
                                                                {
                                                                  "argumentTypes": null,
                                                                  "id": 4169,
                                                                  "name": "value2",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 3696,
                                                                  "src": "56273:6:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                }
                                                              ],
                                                              "expression": {
                                                                "argumentTypes": [
                                                                  {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  },
                                                                  {
                                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                                    "typeString": "bytes calldata"
                                                                  },
                                                                  {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  },
                                                                  {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                ],
                                                                "id": 4161,
                                                                "name": "_call",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3676,
                                                                "src": "56238:5:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_bytes_memory_ptr_$_t_uint8_$",
                                                                  "typeString": "function (uint256,bytes memory,uint256,uint256) returns (bytes memory,uint8)"
                                                                }
                                                              },
                                                              "id": 4170,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "kind": "functionCall",
                                                              "lValueRequested": false,
                                                              "names": [],
                                                              "nodeType": "FunctionCall",
                                                              "src": "56238:42:0",
                                                              "tryCall": false,
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_tuple$_t_bytes_memory_ptr_$_t_uint8_$",
                                                                "typeString": "tuple(bytes memory,uint8)"
                                                              }
                                                            },
                                                            "nodeType": "VariableDeclarationStatement",
                                                            "src": "56190:90:0"
                                                          },
                                                          {
                                                            "condition": {
                                                              "argumentTypes": null,
                                                              "commonType": {
                                                                "typeIdentifier": "t_uint8",
                                                                "typeString": "uint8"
                                                              },
                                                              "id": 4174,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "lValueRequested": false,
                                                              "leftExpression": {
                                                                "argumentTypes": null,
                                                                "id": 4172,
                                                                "name": "returnValues",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4160,
                                                                "src": "56303:12:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_uint8",
                                                                  "typeString": "uint8"
                                                                }
                                                              },
                                                              "nodeType": "BinaryOperation",
                                                              "operator": "==",
                                                              "rightExpression": {
                                                                "argumentTypes": null,
                                                                "hexValue": "31",
                                                                "id": 4173,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "kind": "number",
                                                                "lValueRequested": false,
                                                                "nodeType": "Literal",
                                                                "src": "56319:1:0",
                                                                "subdenomination": null,
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_rational_1_by_1",
                                                                  "typeString": "int_const 1"
                                                                },
                                                                "value": "1"
                                                              },
                                                              "src": "56303:17:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_bool",
                                                                "typeString": "bool"
                                                              }
                                                            },
                                                            "falseBody": {
                                                              "condition": {
                                                                "argumentTypes": null,
                                                                "commonType": {
                                                                  "typeIdentifier": "t_uint8",
                                                                  "typeString": "uint8"
                                                                },
                                                                "id": 4189,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "leftExpression": {
                                                                  "argumentTypes": null,
                                                                  "id": 4187,
                                                                  "name": "returnValues",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 4160,
                                                                  "src": "56417:12:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint8",
                                                                    "typeString": "uint8"
                                                                  }
                                                                },
                                                                "nodeType": "BinaryOperation",
                                                                "operator": "==",
                                                                "rightExpression": {
                                                                  "argumentTypes": null,
                                                                  "hexValue": "32",
                                                                  "id": 4188,
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": true,
                                                                  "kind": "number",
                                                                  "lValueRequested": false,
                                                                  "nodeType": "Literal",
                                                                  "src": "56433:1:0",
                                                                  "subdenomination": null,
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_rational_2_by_1",
                                                                    "typeString": "int_const 2"
                                                                  },
                                                                  "value": "2"
                                                                },
                                                                "src": "56417:17:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_bool",
                                                                  "typeString": "bool"
                                                                }
                                                              },
                                                              "falseBody": null,
                                                              "id": 4205,
                                                              "nodeType": "IfStatement",
                                                              "src": "56413:125:0",
                                                              "trueBody": {
                                                                "id": 4204,
                                                                "nodeType": "Block",
                                                                "src": "56436:102:0",
                                                                "statements": [
                                                                  {
                                                                    "expression": {
                                                                      "argumentTypes": null,
                                                                      "id": 4202,
                                                                      "isConstant": false,
                                                                      "isLValue": false,
                                                                      "isPure": false,
                                                                      "lValueRequested": false,
                                                                      "leftHandSide": {
                                                                        "argumentTypes": null,
                                                                        "components": [
                                                                          {
                                                                            "argumentTypes": null,
                                                                            "id": 4190,
                                                                            "name": "value1",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 3694,
                                                                            "src": "56459:6:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_uint256",
                                                                              "typeString": "uint256"
                                                                            }
                                                                          },
                                                                          {
                                                                            "argumentTypes": null,
                                                                            "id": 4191,
                                                                            "name": "value2",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 3696,
                                                                            "src": "56467:6:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_uint256",
                                                                              "typeString": "uint256"
                                                                            }
                                                                          }
                                                                        ],
                                                                        "id": 4192,
                                                                        "isConstant": false,
                                                                        "isInlineArray": false,
                                                                        "isLValue": true,
                                                                        "isPure": false,
                                                                        "lValueRequested": true,
                                                                        "nodeType": "TupleExpression",
                                                                        "src": "56458:16:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                                                          "typeString": "tuple(uint256,uint256)"
                                                                        }
                                                                      },
                                                                      "nodeType": "Assignment",
                                                                      "operator": "=",
                                                                      "rightHandSide": {
                                                                        "argumentTypes": null,
                                                                        "arguments": [
                                                                          {
                                                                            "argumentTypes": null,
                                                                            "id": 4195,
                                                                            "name": "returnData",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": 4158,
                                                                            "src": "56488:10:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_bytes_memory_ptr",
                                                                              "typeString": "bytes memory"
                                                                            }
                                                                          },
                                                                          {
                                                                            "argumentTypes": null,
                                                                            "components": [
                                                                              {
                                                                                "argumentTypes": null,
                                                                                "id": 4197,
                                                                                "isConstant": false,
                                                                                "isLValue": false,
                                                                                "isPure": true,
                                                                                "lValueRequested": false,
                                                                                "nodeType": "ElementaryTypeNameExpression",
                                                                                "src": "56501:7:0",
                                                                                "typeDescriptions": {
                                                                                  "typeIdentifier": "t_type$_t_uint256_$",
                                                                                  "typeString": "type(uint256)"
                                                                                },
                                                                                "typeName": {
                                                                                  "id": 4196,
                                                                                  "name": "uint256",
                                                                                  "nodeType": "ElementaryTypeName",
                                                                                  "src": "56501:7:0",
                                                                                  "typeDescriptions": {
                                                                                    "typeIdentifier": null,
                                                                                    "typeString": null
                                                                                  }
                                                                                }
                                                                              },
                                                                              {
                                                                                "argumentTypes": null,
                                                                                "id": 4199,
                                                                                "isConstant": false,
                                                                                "isLValue": false,
                                                                                "isPure": true,
                                                                                "lValueRequested": false,
                                                                                "nodeType": "ElementaryTypeNameExpression",
                                                                                "src": "56510:7:0",
                                                                                "typeDescriptions": {
                                                                                  "typeIdentifier": "t_type$_t_uint256_$",
                                                                                  "typeString": "type(uint256)"
                                                                                },
                                                                                "typeName": {
                                                                                  "id": 4198,
                                                                                  "name": "uint256",
                                                                                  "nodeType": "ElementaryTypeName",
                                                                                  "src": "56510:7:0",
                                                                                  "typeDescriptions": {
                                                                                    "typeIdentifier": null,
                                                                                    "typeString": null
                                                                                  }
                                                                                }
                                                                              }
                                                                            ],
                                                                            "id": 4200,
                                                                            "isConstant": false,
                                                                            "isInlineArray": false,
                                                                            "isLValue": false,
                                                                            "isPure": true,
                                                                            "lValueRequested": false,
                                                                            "nodeType": "TupleExpression",
                                                                            "src": "56500:18:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_tuple$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$",
                                                                              "typeString": "tuple(type(uint256),type(uint256))"
                                                                            }
                                                                          }
                                                                        ],
                                                                        "expression": {
                                                                          "argumentTypes": [
                                                                            {
                                                                              "typeIdentifier": "t_bytes_memory_ptr",
                                                                              "typeString": "bytes memory"
                                                                            },
                                                                            {
                                                                              "typeIdentifier": "t_tuple$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$",
                                                                              "typeString": "tuple(type(uint256),type(uint256))"
                                                                            }
                                                                          ],
                                                                          "expression": {
                                                                            "argumentTypes": null,
                                                                            "id": 4193,
                                                                            "name": "abi",
                                                                            "nodeType": "Identifier",
                                                                            "overloadedDeclarations": [],
                                                                            "referencedDeclaration": -1,
                                                                            "src": "56477:3:0",
                                                                            "typeDescriptions": {
                                                                              "typeIdentifier": "t_magic_abi",
                                                                              "typeString": "abi"
                                                                            }
                                                                          },
                                                                          "id": 4194,
                                                                          "isConstant": false,
                                                                          "isLValue": false,
                                                                          "isPure": true,
                                                                          "lValueRequested": false,
                                                                          "memberName": "decode",
                                                                          "nodeType": "MemberAccess",
                                                                          "referencedDeclaration": null,
                                                                          "src": "56477:10:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                                            "typeString": "function () pure"
                                                                          }
                                                                        },
                                                                        "id": 4201,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": false,
                                                                        "kind": "functionCall",
                                                                        "lValueRequested": false,
                                                                        "names": [],
                                                                        "nodeType": "FunctionCall",
                                                                        "src": "56477:42:0",
                                                                        "tryCall": false,
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                                                          "typeString": "tuple(uint256,uint256)"
                                                                        }
                                                                      },
                                                                      "src": "56458:61:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_tuple$__$",
                                                                        "typeString": "tuple()"
                                                                      }
                                                                    },
                                                                    "id": 4203,
                                                                    "nodeType": "ExpressionStatement",
                                                                    "src": "56458:61:0"
                                                                  }
                                                                ]
                                                              }
                                                            },
                                                            "id": 4206,
                                                            "nodeType": "IfStatement",
                                                            "src": "56299:239:0",
                                                            "trueBody": {
                                                              "id": 4186,
                                                              "nodeType": "Block",
                                                              "src": "56322:85:0",
                                                              "statements": [
                                                                {
                                                                  "expression": {
                                                                    "argumentTypes": null,
                                                                    "id": 4184,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": false,
                                                                    "lValueRequested": false,
                                                                    "leftHandSide": {
                                                                      "argumentTypes": null,
                                                                      "components": [
                                                                        {
                                                                          "argumentTypes": null,
                                                                          "id": 4175,
                                                                          "name": "value1",
                                                                          "nodeType": "Identifier",
                                                                          "overloadedDeclarations": [],
                                                                          "referencedDeclaration": 3694,
                                                                          "src": "56345:6:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_uint256",
                                                                            "typeString": "uint256"
                                                                          }
                                                                        }
                                                                      ],
                                                                      "id": 4176,
                                                                      "isConstant": false,
                                                                      "isInlineArray": false,
                                                                      "isLValue": true,
                                                                      "isPure": false,
                                                                      "lValueRequested": true,
                                                                      "nodeType": "TupleExpression",
                                                                      "src": "56344:8:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_uint256",
                                                                        "typeString": "uint256"
                                                                      }
                                                                    },
                                                                    "nodeType": "Assignment",
                                                                    "operator": "=",
                                                                    "rightHandSide": {
                                                                      "argumentTypes": null,
                                                                      "arguments": [
                                                                        {
                                                                          "argumentTypes": null,
                                                                          "id": 4179,
                                                                          "name": "returnData",
                                                                          "nodeType": "Identifier",
                                                                          "overloadedDeclarations": [],
                                                                          "referencedDeclaration": 4158,
                                                                          "src": "56366:10:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                                            "typeString": "bytes memory"
                                                                          }
                                                                        },
                                                                        {
                                                                          "argumentTypes": null,
                                                                          "components": [
                                                                            {
                                                                              "argumentTypes": null,
                                                                              "id": 4181,
                                                                              "isConstant": false,
                                                                              "isLValue": false,
                                                                              "isPure": true,
                                                                              "lValueRequested": false,
                                                                              "nodeType": "ElementaryTypeNameExpression",
                                                                              "src": "56379:7:0",
                                                                              "typeDescriptions": {
                                                                                "typeIdentifier": "t_type$_t_uint256_$",
                                                                                "typeString": "type(uint256)"
                                                                              },
                                                                              "typeName": {
                                                                                "id": 4180,
                                                                                "name": "uint256",
                                                                                "nodeType": "ElementaryTypeName",
                                                                                "src": "56379:7:0",
                                                                                "typeDescriptions": {
                                                                                  "typeIdentifier": null,
                                                                                  "typeString": null
                                                                                }
                                                                              }
                                                                            }
                                                                          ],
                                                                          "id": 4182,
                                                                          "isConstant": false,
                                                                          "isInlineArray": false,
                                                                          "isLValue": false,
                                                                          "isPure": true,
                                                                          "lValueRequested": false,
                                                                          "nodeType": "TupleExpression",
                                                                          "src": "56378:9:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_type$_t_uint256_$",
                                                                            "typeString": "type(uint256)"
                                                                          }
                                                                        }
                                                                      ],
                                                                      "expression": {
                                                                        "argumentTypes": [
                                                                          {
                                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                                            "typeString": "bytes memory"
                                                                          },
                                                                          {
                                                                            "typeIdentifier": "t_type$_t_uint256_$",
                                                                            "typeString": "type(uint256)"
                                                                          }
                                                                        ],
                                                                        "expression": {
                                                                          "argumentTypes": null,
                                                                          "id": 4177,
                                                                          "name": "abi",
                                                                          "nodeType": "Identifier",
                                                                          "overloadedDeclarations": [],
                                                                          "referencedDeclaration": -1,
                                                                          "src": "56355:3:0",
                                                                          "typeDescriptions": {
                                                                            "typeIdentifier": "t_magic_abi",
                                                                            "typeString": "abi"
                                                                          }
                                                                        },
                                                                        "id": 4178,
                                                                        "isConstant": false,
                                                                        "isLValue": false,
                                                                        "isPure": true,
                                                                        "lValueRequested": false,
                                                                        "memberName": "decode",
                                                                        "nodeType": "MemberAccess",
                                                                        "referencedDeclaration": null,
                                                                        "src": "56355:10:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                                          "typeString": "function () pure"
                                                                        }
                                                                      },
                                                                      "id": 4183,
                                                                      "isConstant": false,
                                                                      "isLValue": false,
                                                                      "isPure": false,
                                                                      "kind": "functionCall",
                                                                      "lValueRequested": false,
                                                                      "names": [],
                                                                      "nodeType": "FunctionCall",
                                                                      "src": "56355:33:0",
                                                                      "tryCall": false,
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_uint256",
                                                                        "typeString": "uint256"
                                                                      }
                                                                    },
                                                                    "src": "56344:44:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_uint256",
                                                                      "typeString": "uint256"
                                                                    }
                                                                  },
                                                                  "id": 4185,
                                                                  "nodeType": "ExpressionStatement",
                                                                  "src": "56344:44:0"
                                                                }
                                                              ]
                                                            }
                                                          }
                                                        ]
                                                      }
                                                    },
                                                    "id": 4272,
                                                    "nodeType": "IfStatement",
                                                    "src": "55869:1121:0",
                                                    "trueBody": {
                                                      "id": 4153,
                                                      "nodeType": "Block",
                                                      "src": "55915:224:0",
                                                      "statements": [
                                                        {
                                                          "assignments": [
                                                            4121,
                                                            4124,
                                                            4127
                                                          ],
                                                          "declarations": [
                                                            {
                                                              "constant": false,
                                                              "id": 4121,
                                                              "mutability": "mutable",
                                                              "name": "token",
                                                              "nodeType": "VariableDeclaration",
                                                              "overrides": null,
                                                              "scope": 4153,
                                                              "src": "55934:12:0",
                                                              "stateVariable": false,
                                                              "storageLocation": "default",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                "typeString": "contract IERC20"
                                                              },
                                                              "typeName": {
                                                                "contractScope": null,
                                                                "id": 4120,
                                                                "name": "IERC20",
                                                                "nodeType": "UserDefinedTypeName",
                                                                "referencedDeclaration": 1118,
                                                                "src": "55934:6:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                  "typeString": "contract IERC20"
                                                                }
                                                              },
                                                              "value": null,
                                                              "visibility": "internal"
                                                            },
                                                            {
                                                              "constant": false,
                                                              "id": 4124,
                                                              "mutability": "mutable",
                                                              "name": "tos",
                                                              "nodeType": "VariableDeclaration",
                                                              "overrides": null,
                                                              "scope": 4153,
                                                              "src": "55948:20:0",
                                                              "stateVariable": false,
                                                              "storageLocation": "memory",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                                                "typeString": "address[]"
                                                              },
                                                              "typeName": {
                                                                "baseType": {
                                                                  "id": 4122,
                                                                  "name": "address",
                                                                  "nodeType": "ElementaryTypeName",
                                                                  "src": "55948:7:0",
                                                                  "stateMutability": "nonpayable",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_address",
                                                                    "typeString": "address"
                                                                  }
                                                                },
                                                                "id": 4123,
                                                                "length": null,
                                                                "nodeType": "ArrayTypeName",
                                                                "src": "55948:9:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                                                                  "typeString": "address[]"
                                                                }
                                                              },
                                                              "value": null,
                                                              "visibility": "internal"
                                                            },
                                                            {
                                                              "constant": false,
                                                              "id": 4127,
                                                              "mutability": "mutable",
                                                              "name": "shares",
                                                              "nodeType": "VariableDeclaration",
                                                              "overrides": null,
                                                              "scope": 4153,
                                                              "src": "55970:23:0",
                                                              "stateVariable": false,
                                                              "storageLocation": "memory",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                                                "typeString": "uint256[]"
                                                              },
                                                              "typeName": {
                                                                "baseType": {
                                                                  "id": 4125,
                                                                  "name": "uint256",
                                                                  "nodeType": "ElementaryTypeName",
                                                                  "src": "55970:7:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                },
                                                                "id": 4126,
                                                                "length": null,
                                                                "nodeType": "ArrayTypeName",
                                                                "src": "55970:9:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                                                  "typeString": "uint256[]"
                                                                }
                                                              },
                                                              "value": null,
                                                              "visibility": "internal"
                                                            }
                                                          ],
                                                          "id": 4142,
                                                          "initialValue": {
                                                            "argumentTypes": null,
                                                            "arguments": [
                                                              {
                                                                "argumentTypes": null,
                                                                "baseExpression": {
                                                                  "argumentTypes": null,
                                                                  "id": 4130,
                                                                  "name": "datas",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 3691,
                                                                  "src": "56008:5:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                                    "typeString": "bytes calldata[] calldata"
                                                                  }
                                                                },
                                                                "id": 4132,
                                                                "indexExpression": {
                                                                  "argumentTypes": null,
                                                                  "id": 4131,
                                                                  "name": "i",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 3702,
                                                                  "src": "56014:1:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                },
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "nodeType": "IndexAccess",
                                                                "src": "56008:8:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                                                  "typeString": "bytes calldata"
                                                                }
                                                              },
                                                              {
                                                                "argumentTypes": null,
                                                                "components": [
                                                                  {
                                                                    "argumentTypes": null,
                                                                    "id": 4133,
                                                                    "name": "IERC20",
                                                                    "nodeType": "Identifier",
                                                                    "overloadedDeclarations": [],
                                                                    "referencedDeclaration": 1118,
                                                                    "src": "56019:6:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_type$_t_contract$_IERC20_$1118_$",
                                                                      "typeString": "type(contract IERC20)"
                                                                    }
                                                                  },
                                                                  {
                                                                    "argumentTypes": null,
                                                                    "baseExpression": {
                                                                      "argumentTypes": null,
                                                                      "id": 4135,
                                                                      "isConstant": false,
                                                                      "isLValue": false,
                                                                      "isPure": true,
                                                                      "lValueRequested": false,
                                                                      "nodeType": "ElementaryTypeNameExpression",
                                                                      "src": "56027:7:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_address_$",
                                                                        "typeString": "type(address)"
                                                                      },
                                                                      "typeName": {
                                                                        "id": 4134,
                                                                        "name": "address",
                                                                        "nodeType": "ElementaryTypeName",
                                                                        "src": "56027:7:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": null,
                                                                          "typeString": null
                                                                        }
                                                                      }
                                                                    },
                                                                    "id": 4136,
                                                                    "indexExpression": null,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": true,
                                                                    "lValueRequested": false,
                                                                    "nodeType": "IndexAccess",
                                                                    "src": "56027:9:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_type$_t_array$_t_address_$dyn_memory_ptr_$",
                                                                      "typeString": "type(address[] memory)"
                                                                    }
                                                                  },
                                                                  {
                                                                    "argumentTypes": null,
                                                                    "baseExpression": {
                                                                      "argumentTypes": null,
                                                                      "id": 4138,
                                                                      "isConstant": false,
                                                                      "isLValue": false,
                                                                      "isPure": true,
                                                                      "lValueRequested": false,
                                                                      "nodeType": "ElementaryTypeNameExpression",
                                                                      "src": "56038:7:0",
                                                                      "typeDescriptions": {
                                                                        "typeIdentifier": "t_type$_t_uint256_$",
                                                                        "typeString": "type(uint256)"
                                                                      },
                                                                      "typeName": {
                                                                        "id": 4137,
                                                                        "name": "uint256",
                                                                        "nodeType": "ElementaryTypeName",
                                                                        "src": "56038:7:0",
                                                                        "typeDescriptions": {
                                                                          "typeIdentifier": null,
                                                                          "typeString": null
                                                                        }
                                                                      }
                                                                    },
                                                                    "id": 4139,
                                                                    "indexExpression": null,
                                                                    "isConstant": false,
                                                                    "isLValue": false,
                                                                    "isPure": true,
                                                                    "lValueRequested": false,
                                                                    "nodeType": "IndexAccess",
                                                                    "src": "56038:9:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": "t_type$_t_array$_t_uint256_$dyn_memory_ptr_$",
                                                                      "typeString": "type(uint256[] memory)"
                                                                    }
                                                                  }
                                                                ],
                                                                "id": 4140,
                                                                "isConstant": false,
                                                                "isInlineArray": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "lValueRequested": false,
                                                                "nodeType": "TupleExpression",
                                                                "src": "56018:30:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_array$_t_address_$dyn_memory_ptr_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$",
                                                                  "typeString": "tuple(type(contract IERC20),type(address[] memory),type(uint256[] memory))"
                                                                }
                                                              }
                                                            ],
                                                            "expression": {
                                                              "argumentTypes": [
                                                                {
                                                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                                                  "typeString": "bytes calldata"
                                                                },
                                                                {
                                                                  "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_array$_t_address_$dyn_memory_ptr_$_$_t_type$_t_array$_t_uint256_$dyn_memory_ptr_$_$",
                                                                  "typeString": "tuple(type(contract IERC20),type(address[] memory),type(uint256[] memory))"
                                                                }
                                                              ],
                                                              "expression": {
                                                                "argumentTypes": null,
                                                                "id": 4128,
                                                                "name": "abi",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": -1,
                                                                "src": "55997:3:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_magic_abi",
                                                                  "typeString": "abi"
                                                                }
                                                              },
                                                              "id": 4129,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": true,
                                                              "lValueRequested": false,
                                                              "memberName": "decode",
                                                              "nodeType": "MemberAccess",
                                                              "referencedDeclaration": null,
                                                              "src": "55997:10:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                                "typeString": "function () pure"
                                                              }
                                                            },
                                                            "id": 4141,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "kind": "functionCall",
                                                            "lValueRequested": false,
                                                            "names": [],
                                                            "nodeType": "FunctionCall",
                                                            "src": "55997:52:0",
                                                            "tryCall": false,
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_tuple$_t_contract$_IERC20_$1118_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$",
                                                              "typeString": "tuple(contract IERC20,address[] memory,uint256[] memory)"
                                                            }
                                                          },
                                                          "nodeType": "VariableDeclarationStatement",
                                                          "src": "55933:116:0"
                                                        },
                                                        {
                                                          "expression": {
                                                            "argumentTypes": null,
                                                            "arguments": [
                                                              {
                                                                "argumentTypes": null,
                                                                "id": 4146,
                                                                "name": "token",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4121,
                                                                "src": "56093:5:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                  "typeString": "contract IERC20"
                                                                }
                                                              },
                                                              {
                                                                "argumentTypes": null,
                                                                "expression": {
                                                                  "argumentTypes": null,
                                                                  "id": 4147,
                                                                  "name": "msg",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": -15,
                                                                  "src": "56100:3:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_magic_message",
                                                                    "typeString": "msg"
                                                                  }
                                                                },
                                                                "id": 4148,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "memberName": "sender",
                                                                "nodeType": "MemberAccess",
                                                                "referencedDeclaration": null,
                                                                "src": "56100:10:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_address_payable",
                                                                  "typeString": "address payable"
                                                                }
                                                              },
                                                              {
                                                                "argumentTypes": null,
                                                                "id": 4149,
                                                                "name": "tos",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4124,
                                                                "src": "56112:3:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                                                  "typeString": "address[] memory"
                                                                }
                                                              },
                                                              {
                                                                "argumentTypes": null,
                                                                "id": 4150,
                                                                "name": "shares",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 4127,
                                                                "src": "56117:6:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                                                  "typeString": "uint256[] memory"
                                                                }
                                                              }
                                                            ],
                                                            "expression": {
                                                              "argumentTypes": [
                                                                {
                                                                  "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                  "typeString": "contract IERC20"
                                                                },
                                                                {
                                                                  "typeIdentifier": "t_address_payable",
                                                                  "typeString": "address payable"
                                                                },
                                                                {
                                                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                                                  "typeString": "address[] memory"
                                                                },
                                                                {
                                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                                                  "typeString": "uint256[] memory"
                                                                }
                                                              ],
                                                              "expression": {
                                                                "argumentTypes": null,
                                                                "id": 4143,
                                                                "name": "bentoBox",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 1983,
                                                                "src": "56067:8:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                                                  "typeString": "contract IBentoBoxV1"
                                                                }
                                                              },
                                                              "id": 4145,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "lValueRequested": false,
                                                              "memberName": "transferMultiple",
                                                              "nodeType": "MemberAccess",
                                                              "referencedDeclaration": 1755,
                                                              "src": "56067:25:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_array$_t_address_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$",
                                                                "typeString": "function (contract IERC20,address,address[] memory,uint256[] memory) external"
                                                              }
                                                            },
                                                            "id": 4151,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "kind": "functionCall",
                                                            "lValueRequested": false,
                                                            "names": [],
                                                            "nodeType": "FunctionCall",
                                                            "src": "56067:57:0",
                                                            "tryCall": false,
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_tuple$__$",
                                                              "typeString": "tuple()"
                                                            }
                                                          },
                                                          "id": 4152,
                                                          "nodeType": "ExpressionStatement",
                                                          "src": "56067:57:0"
                                                        }
                                                      ]
                                                    }
                                                  },
                                                  "id": 4273,
                                                  "nodeType": "IfStatement",
                                                  "src": "55616:1374:0",
                                                  "trueBody": {
                                                    "id": 4116,
                                                    "nodeType": "Block",
                                                    "src": "55653:210:0",
                                                    "statements": [
                                                      {
                                                        "assignments": [
                                                          4084,
                                                          4086,
                                                          4088
                                                        ],
                                                        "declarations": [
                                                          {
                                                            "constant": false,
                                                            "id": 4084,
                                                            "mutability": "mutable",
                                                            "name": "token",
                                                            "nodeType": "VariableDeclaration",
                                                            "overrides": null,
                                                            "scope": 4116,
                                                            "src": "55672:12:0",
                                                            "stateVariable": false,
                                                            "storageLocation": "default",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_contract$_IERC20_$1118",
                                                              "typeString": "contract IERC20"
                                                            },
                                                            "typeName": {
                                                              "contractScope": null,
                                                              "id": 4083,
                                                              "name": "IERC20",
                                                              "nodeType": "UserDefinedTypeName",
                                                              "referencedDeclaration": 1118,
                                                              "src": "55672:6:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                "typeString": "contract IERC20"
                                                              }
                                                            },
                                                            "value": null,
                                                            "visibility": "internal"
                                                          },
                                                          {
                                                            "constant": false,
                                                            "id": 4086,
                                                            "mutability": "mutable",
                                                            "name": "to",
                                                            "nodeType": "VariableDeclaration",
                                                            "overrides": null,
                                                            "scope": 4116,
                                                            "src": "55686:10:0",
                                                            "stateVariable": false,
                                                            "storageLocation": "default",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_address",
                                                              "typeString": "address"
                                                            },
                                                            "typeName": {
                                                              "id": 4085,
                                                              "name": "address",
                                                              "nodeType": "ElementaryTypeName",
                                                              "src": "55686:7:0",
                                                              "stateMutability": "nonpayable",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_address",
                                                                "typeString": "address"
                                                              }
                                                            },
                                                            "value": null,
                                                            "visibility": "internal"
                                                          },
                                                          {
                                                            "constant": false,
                                                            "id": 4088,
                                                            "mutability": "mutable",
                                                            "name": "share",
                                                            "nodeType": "VariableDeclaration",
                                                            "overrides": null,
                                                            "scope": 4116,
                                                            "src": "55698:12:0",
                                                            "stateVariable": false,
                                                            "storageLocation": "default",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_int256",
                                                              "typeString": "int256"
                                                            },
                                                            "typeName": {
                                                              "id": 4087,
                                                              "name": "int256",
                                                              "nodeType": "ElementaryTypeName",
                                                              "src": "55698:6:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_int256",
                                                                "typeString": "int256"
                                                              }
                                                            },
                                                            "value": null,
                                                            "visibility": "internal"
                                                          }
                                                        ],
                                                        "id": 4101,
                                                        "initialValue": {
                                                          "argumentTypes": null,
                                                          "arguments": [
                                                            {
                                                              "argumentTypes": null,
                                                              "baseExpression": {
                                                                "argumentTypes": null,
                                                                "id": 4091,
                                                                "name": "datas",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3691,
                                                                "src": "55725:5:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                                  "typeString": "bytes calldata[] calldata"
                                                                }
                                                              },
                                                              "id": 4093,
                                                              "indexExpression": {
                                                                "argumentTypes": null,
                                                                "id": 4092,
                                                                "name": "i",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3702,
                                                                "src": "55731:1:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_uint256",
                                                                  "typeString": "uint256"
                                                                }
                                                              },
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "lValueRequested": false,
                                                              "nodeType": "IndexAccess",
                                                              "src": "55725:8:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                              }
                                                            },
                                                            {
                                                              "argumentTypes": null,
                                                              "components": [
                                                                {
                                                                  "argumentTypes": null,
                                                                  "id": 4094,
                                                                  "name": "IERC20",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 1118,
                                                                  "src": "55736:6:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_contract$_IERC20_$1118_$",
                                                                    "typeString": "type(contract IERC20)"
                                                                  }
                                                                },
                                                                {
                                                                  "argumentTypes": null,
                                                                  "id": 4096,
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": true,
                                                                  "lValueRequested": false,
                                                                  "nodeType": "ElementaryTypeNameExpression",
                                                                  "src": "55744:7:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_address_$",
                                                                    "typeString": "type(address)"
                                                                  },
                                                                  "typeName": {
                                                                    "id": 4095,
                                                                    "name": "address",
                                                                    "nodeType": "ElementaryTypeName",
                                                                    "src": "55744:7:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": null,
                                                                      "typeString": null
                                                                    }
                                                                  }
                                                                },
                                                                {
                                                                  "argumentTypes": null,
                                                                  "id": 4098,
                                                                  "isConstant": false,
                                                                  "isLValue": false,
                                                                  "isPure": true,
                                                                  "lValueRequested": false,
                                                                  "nodeType": "ElementaryTypeNameExpression",
                                                                  "src": "55753:6:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_type$_t_int256_$",
                                                                    "typeString": "type(int256)"
                                                                  },
                                                                  "typeName": {
                                                                    "id": 4097,
                                                                    "name": "int256",
                                                                    "nodeType": "ElementaryTypeName",
                                                                    "src": "55753:6:0",
                                                                    "typeDescriptions": {
                                                                      "typeIdentifier": null,
                                                                      "typeString": null
                                                                    }
                                                                  }
                                                                }
                                                              ],
                                                              "id": 4099,
                                                              "isConstant": false,
                                                              "isInlineArray": false,
                                                              "isLValue": false,
                                                              "isPure": true,
                                                              "lValueRequested": false,
                                                              "nodeType": "TupleExpression",
                                                              "src": "55735:25:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_address_$_$_t_type$_t_int256_$_$",
                                                                "typeString": "tuple(type(contract IERC20),type(address),type(int256))"
                                                              }
                                                            }
                                                          ],
                                                          "expression": {
                                                            "argumentTypes": [
                                                              {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                              },
                                                              {
                                                                "typeIdentifier": "t_tuple$_t_type$_t_contract$_IERC20_$1118_$_$_t_type$_t_address_$_$_t_type$_t_int256_$_$",
                                                                "typeString": "tuple(type(contract IERC20),type(address),type(int256))"
                                                              }
                                                            ],
                                                            "expression": {
                                                              "argumentTypes": null,
                                                              "id": 4089,
                                                              "name": "abi",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": -1,
                                                              "src": "55714:3:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_magic_abi",
                                                                "typeString": "abi"
                                                              }
                                                            },
                                                            "id": 4090,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "memberName": "decode",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": null,
                                                            "src": "55714:10:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                              "typeString": "function () pure"
                                                            }
                                                          },
                                                          "id": 4100,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": false,
                                                          "kind": "functionCall",
                                                          "lValueRequested": false,
                                                          "names": [],
                                                          "nodeType": "FunctionCall",
                                                          "src": "55714:47:0",
                                                          "tryCall": false,
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_tuple$_t_contract$_IERC20_$1118_$_t_address_payable_$_t_int256_$",
                                                            "typeString": "tuple(contract IERC20,address payable,int256)"
                                                          }
                                                        },
                                                        "nodeType": "VariableDeclarationStatement",
                                                        "src": "55671:90:0"
                                                      },
                                                      {
                                                        "expression": {
                                                          "argumentTypes": null,
                                                          "arguments": [
                                                            {
                                                              "argumentTypes": null,
                                                              "id": 4105,
                                                              "name": "token",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 4084,
                                                              "src": "55797:5:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                "typeString": "contract IERC20"
                                                              }
                                                            },
                                                            {
                                                              "argumentTypes": null,
                                                              "expression": {
                                                                "argumentTypes": null,
                                                                "id": 4106,
                                                                "name": "msg",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": -15,
                                                                "src": "55804:3:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_magic_message",
                                                                  "typeString": "msg"
                                                                }
                                                              },
                                                              "id": 4107,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "lValueRequested": false,
                                                              "memberName": "sender",
                                                              "nodeType": "MemberAccess",
                                                              "referencedDeclaration": null,
                                                              "src": "55804:10:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_address_payable",
                                                                "typeString": "address payable"
                                                              }
                                                            },
                                                            {
                                                              "argumentTypes": null,
                                                              "id": 4108,
                                                              "name": "to",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 4086,
                                                              "src": "55816:2:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_address",
                                                                "typeString": "address"
                                                              }
                                                            },
                                                            {
                                                              "argumentTypes": null,
                                                              "arguments": [
                                                                {
                                                                  "argumentTypes": null,
                                                                  "id": 4110,
                                                                  "name": "share",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 4088,
                                                                  "src": "55825:5:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_int256",
                                                                    "typeString": "int256"
                                                                  }
                                                                },
                                                                {
                                                                  "argumentTypes": null,
                                                                  "id": 4111,
                                                                  "name": "value1",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 3694,
                                                                  "src": "55832:6:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                },
                                                                {
                                                                  "argumentTypes": null,
                                                                  "id": 4112,
                                                                  "name": "value2",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 3696,
                                                                  "src": "55840:6:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                }
                                                              ],
                                                              "expression": {
                                                                "argumentTypes": [
                                                                  {
                                                                    "typeIdentifier": "t_int256",
                                                                    "typeString": "int256"
                                                                  },
                                                                  {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  },
                                                                  {
                                                                    "typeIdentifier": "t_uint256",
                                                                    "typeString": "uint256"
                                                                  }
                                                                ],
                                                                "id": 4109,
                                                                "name": "_num",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3422,
                                                                "src": "55820:4:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                                                  "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                                                }
                                                              },
                                                              "id": 4113,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "kind": "functionCall",
                                                              "lValueRequested": false,
                                                              "names": [],
                                                              "nodeType": "FunctionCall",
                                                              "src": "55820:27:0",
                                                              "tryCall": false,
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            }
                                                          ],
                                                          "expression": {
                                                            "argumentTypes": [
                                                              {
                                                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                                                "typeString": "contract IERC20"
                                                              },
                                                              {
                                                                "typeIdentifier": "t_address_payable",
                                                                "typeString": "address payable"
                                                              },
                                                              {
                                                                "typeIdentifier": "t_address",
                                                                "typeString": "address"
                                                              },
                                                              {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            ],
                                                            "expression": {
                                                              "argumentTypes": null,
                                                              "id": 4102,
                                                              "name": "bentoBox",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 1983,
                                                              "src": "55779:8:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                                                "typeString": "contract IBentoBoxV1"
                                                              }
                                                            },
                                                            "id": 4104,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "memberName": "transfer",
                                                            "nodeType": "MemberAccess",
                                                            "referencedDeclaration": 1742,
                                                            "src": "55779:17:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                                              "typeString": "function (contract IERC20,address,address,uint256) external"
                                                            }
                                                          },
                                                          "id": 4114,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": false,
                                                          "kind": "functionCall",
                                                          "lValueRequested": false,
                                                          "names": [],
                                                          "nodeType": "FunctionCall",
                                                          "src": "55779:69:0",
                                                          "tryCall": false,
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_tuple$__$",
                                                            "typeString": "tuple()"
                                                          }
                                                        },
                                                        "id": 4115,
                                                        "nodeType": "ExpressionStatement",
                                                        "src": "55779:69:0"
                                                      }
                                                    ]
                                                  }
                                                },
                                                "id": 4274,
                                                "nodeType": "IfStatement",
                                                "src": "55481:1509:0",
                                                "trueBody": {
                                                  "id": 4079,
                                                  "nodeType": "Block",
                                                  "src": "55518:92:0",
                                                  "statements": [
                                                    {
                                                      "expression": {
                                                        "argumentTypes": null,
                                                        "id": 4077,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "leftHandSide": {
                                                          "argumentTypes": null,
                                                          "components": [
                                                            {
                                                              "argumentTypes": null,
                                                              "id": 4067,
                                                              "name": "value1",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3694,
                                                              "src": "55537:6:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            },
                                                            {
                                                              "argumentTypes": null,
                                                              "id": 4068,
                                                              "name": "value2",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3696,
                                                              "src": "55545:6:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            }
                                                          ],
                                                          "id": 4069,
                                                          "isConstant": false,
                                                          "isInlineArray": false,
                                                          "isLValue": true,
                                                          "isPure": false,
                                                          "lValueRequested": true,
                                                          "nodeType": "TupleExpression",
                                                          "src": "55536:16:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                                            "typeString": "tuple(uint256,uint256)"
                                                          }
                                                        },
                                                        "nodeType": "Assignment",
                                                        "operator": "=",
                                                        "rightHandSide": {
                                                          "argumentTypes": null,
                                                          "arguments": [
                                                            {
                                                              "argumentTypes": null,
                                                              "baseExpression": {
                                                                "argumentTypes": null,
                                                                "id": 4071,
                                                                "name": "datas",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3691,
                                                                "src": "55570:5:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                                  "typeString": "bytes calldata[] calldata"
                                                                }
                                                              },
                                                              "id": 4073,
                                                              "indexExpression": {
                                                                "argumentTypes": null,
                                                                "id": 4072,
                                                                "name": "i",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3702,
                                                                "src": "55576:1:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_uint256",
                                                                  "typeString": "uint256"
                                                                }
                                                              },
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "lValueRequested": false,
                                                              "nodeType": "IndexAccess",
                                                              "src": "55570:8:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                              }
                                                            },
                                                            {
                                                              "argumentTypes": null,
                                                              "id": 4074,
                                                              "name": "value1",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3694,
                                                              "src": "55580:6:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            },
                                                            {
                                                              "argumentTypes": null,
                                                              "id": 4075,
                                                              "name": "value2",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3696,
                                                              "src": "55588:6:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            }
                                                          ],
                                                          "expression": {
                                                            "argumentTypes": [
                                                              {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                              },
                                                              {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              },
                                                              {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            ],
                                                            "id": 4070,
                                                            "name": "_bentoWithdraw",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3554,
                                                            "src": "55555:14:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_function_internal_nonpayable$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                                              "typeString": "function (bytes memory,uint256,uint256) returns (uint256,uint256)"
                                                            }
                                                          },
                                                          "id": 4076,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": false,
                                                          "kind": "functionCall",
                                                          "lValueRequested": false,
                                                          "names": [],
                                                          "nodeType": "FunctionCall",
                                                          "src": "55555:40:0",
                                                          "tryCall": false,
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                                            "typeString": "tuple(uint256,uint256)"
                                                          }
                                                        },
                                                        "src": "55536:59:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_tuple$__$",
                                                          "typeString": "tuple()"
                                                        }
                                                      },
                                                      "id": 4078,
                                                      "nodeType": "ExpressionStatement",
                                                      "src": "55536:59:0"
                                                    }
                                                  ]
                                                }
                                              },
                                              "id": 4275,
                                              "nodeType": "IfStatement",
                                              "src": "55337:1653:0",
                                              "trueBody": {
                                                "id": 4063,
                                                "nodeType": "Block",
                                                "src": "55373:102:0",
                                                "statements": [
                                                  {
                                                    "expression": {
                                                      "argumentTypes": null,
                                                      "id": 4061,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "leftHandSide": {
                                                        "argumentTypes": null,
                                                        "components": [
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4048,
                                                            "name": "value1",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3694,
                                                            "src": "55392:6:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4049,
                                                            "name": "value2",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3696,
                                                            "src": "55400:6:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          }
                                                        ],
                                                        "id": 4050,
                                                        "isConstant": false,
                                                        "isInlineArray": false,
                                                        "isLValue": true,
                                                        "isPure": false,
                                                        "lValueRequested": true,
                                                        "nodeType": "TupleExpression",
                                                        "src": "55391:16:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                                          "typeString": "tuple(uint256,uint256)"
                                                        }
                                                      },
                                                      "nodeType": "Assignment",
                                                      "operator": "=",
                                                      "rightHandSide": {
                                                        "argumentTypes": null,
                                                        "arguments": [
                                                          {
                                                            "argumentTypes": null,
                                                            "baseExpression": {
                                                              "argumentTypes": null,
                                                              "id": 4052,
                                                              "name": "datas",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3691,
                                                              "src": "55424:5:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                                "typeString": "bytes calldata[] calldata"
                                                              }
                                                            },
                                                            "id": 4054,
                                                            "indexExpression": {
                                                              "argumentTypes": null,
                                                              "id": 4053,
                                                              "name": "i",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3702,
                                                              "src": "55430:1:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            },
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "nodeType": "IndexAccess",
                                                            "src": "55424:8:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_bytes_calldata_ptr",
                                                              "typeString": "bytes calldata"
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "baseExpression": {
                                                              "argumentTypes": null,
                                                              "id": 4055,
                                                              "name": "values",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3688,
                                                              "src": "55434:6:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                                                "typeString": "uint256[] calldata"
                                                              }
                                                            },
                                                            "id": 4057,
                                                            "indexExpression": {
                                                              "argumentTypes": null,
                                                              "id": 4056,
                                                              "name": "i",
                                                              "nodeType": "Identifier",
                                                              "overloadedDeclarations": [],
                                                              "referencedDeclaration": 3702,
                                                              "src": "55441:1:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              }
                                                            },
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "nodeType": "IndexAccess",
                                                            "src": "55434:9:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4058,
                                                            "name": "value1",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3694,
                                                            "src": "55445:6:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4059,
                                                            "name": "value2",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3696,
                                                            "src": "55453:6:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          }
                                                        ],
                                                        "expression": {
                                                          "argumentTypes": [
                                                            {
                                                              "typeIdentifier": "t_bytes_calldata_ptr",
                                                              "typeString": "bytes calldata"
                                                            },
                                                            {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            },
                                                            {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            },
                                                            {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          ],
                                                          "id": 4051,
                                                          "name": "_bentoDeposit",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 3500,
                                                          "src": "55410:13:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_nonpayable$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                                            "typeString": "function (bytes memory,uint256,uint256,uint256) returns (uint256,uint256)"
                                                          }
                                                        },
                                                        "id": 4060,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "functionCall",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "55410:50:0",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                                          "typeString": "tuple(uint256,uint256)"
                                                        }
                                                      },
                                                      "src": "55391:69:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_tuple$__$",
                                                        "typeString": "tuple()"
                                                      }
                                                    },
                                                    "id": 4062,
                                                    "nodeType": "ExpressionStatement",
                                                    "src": "55391:69:0"
                                                  }
                                                ]
                                              }
                                            },
                                            "id": 4276,
                                            "nodeType": "IfStatement",
                                            "src": "54985:2005:0",
                                            "trueBody": {
                                              "id": 4044,
                                              "nodeType": "Block",
                                              "src": "55025:306:0",
                                              "statements": [
                                                {
                                                  "assignments": [
                                                    4002,
                                                    4004,
                                                    4006,
                                                    4008,
                                                    4010,
                                                    4012
                                                  ],
                                                  "declarations": [
                                                    {
                                                      "constant": false,
                                                      "id": 4002,
                                                      "mutability": "mutable",
                                                      "name": "user",
                                                      "nodeType": "VariableDeclaration",
                                                      "overrides": null,
                                                      "scope": 4044,
                                                      "src": "55044:12:0",
                                                      "stateVariable": false,
                                                      "storageLocation": "default",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                      },
                                                      "typeName": {
                                                        "id": 4001,
                                                        "name": "address",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "55044:7:0",
                                                        "stateMutability": "nonpayable",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_address",
                                                          "typeString": "address"
                                                        }
                                                      },
                                                      "value": null,
                                                      "visibility": "internal"
                                                    },
                                                    {
                                                      "constant": false,
                                                      "id": 4004,
                                                      "mutability": "mutable",
                                                      "name": "_masterContract",
                                                      "nodeType": "VariableDeclaration",
                                                      "overrides": null,
                                                      "scope": 4044,
                                                      "src": "55058:23:0",
                                                      "stateVariable": false,
                                                      "storageLocation": "default",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                      },
                                                      "typeName": {
                                                        "id": 4003,
                                                        "name": "address",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "55058:7:0",
                                                        "stateMutability": "nonpayable",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_address",
                                                          "typeString": "address"
                                                        }
                                                      },
                                                      "value": null,
                                                      "visibility": "internal"
                                                    },
                                                    {
                                                      "constant": false,
                                                      "id": 4006,
                                                      "mutability": "mutable",
                                                      "name": "approved",
                                                      "nodeType": "VariableDeclaration",
                                                      "overrides": null,
                                                      "scope": 4044,
                                                      "src": "55083:13:0",
                                                      "stateVariable": false,
                                                      "storageLocation": "default",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                      },
                                                      "typeName": {
                                                        "id": 4005,
                                                        "name": "bool",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "55083:4:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bool",
                                                          "typeString": "bool"
                                                        }
                                                      },
                                                      "value": null,
                                                      "visibility": "internal"
                                                    },
                                                    {
                                                      "constant": false,
                                                      "id": 4008,
                                                      "mutability": "mutable",
                                                      "name": "v",
                                                      "nodeType": "VariableDeclaration",
                                                      "overrides": null,
                                                      "scope": 4044,
                                                      "src": "55098:7:0",
                                                      "stateVariable": false,
                                                      "storageLocation": "default",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint8",
                                                        "typeString": "uint8"
                                                      },
                                                      "typeName": {
                                                        "id": 4007,
                                                        "name": "uint8",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "55098:5:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint8",
                                                          "typeString": "uint8"
                                                        }
                                                      },
                                                      "value": null,
                                                      "visibility": "internal"
                                                    },
                                                    {
                                                      "constant": false,
                                                      "id": 4010,
                                                      "mutability": "mutable",
                                                      "name": "r",
                                                      "nodeType": "VariableDeclaration",
                                                      "overrides": null,
                                                      "scope": 4044,
                                                      "src": "55107:9:0",
                                                      "stateVariable": false,
                                                      "storageLocation": "default",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes32",
                                                        "typeString": "bytes32"
                                                      },
                                                      "typeName": {
                                                        "id": 4009,
                                                        "name": "bytes32",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "55107:7:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bytes32",
                                                          "typeString": "bytes32"
                                                        }
                                                      },
                                                      "value": null,
                                                      "visibility": "internal"
                                                    },
                                                    {
                                                      "constant": false,
                                                      "id": 4012,
                                                      "mutability": "mutable",
                                                      "name": "s",
                                                      "nodeType": "VariableDeclaration",
                                                      "overrides": null,
                                                      "scope": 4044,
                                                      "src": "55118:9:0",
                                                      "stateVariable": false,
                                                      "storageLocation": "default",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes32",
                                                        "typeString": "bytes32"
                                                      },
                                                      "typeName": {
                                                        "id": 4011,
                                                        "name": "bytes32",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "55118:7:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bytes32",
                                                          "typeString": "bytes32"
                                                        }
                                                      },
                                                      "value": null,
                                                      "visibility": "internal"
                                                    }
                                                  ],
                                                  "id": 4032,
                                                  "initialValue": {
                                                    "argumentTypes": null,
                                                    "arguments": [
                                                      {
                                                        "argumentTypes": null,
                                                        "baseExpression": {
                                                          "argumentTypes": null,
                                                          "id": 4015,
                                                          "name": "datas",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 3691,
                                                          "src": "55162:5:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                            "typeString": "bytes calldata[] calldata"
                                                          }
                                                        },
                                                        "id": 4017,
                                                        "indexExpression": {
                                                          "argumentTypes": null,
                                                          "id": 4016,
                                                          "name": "i",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 3702,
                                                          "src": "55168:1:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                          }
                                                        },
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "nodeType": "IndexAccess",
                                                        "src": "55162:8:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bytes_calldata_ptr",
                                                          "typeString": "bytes calldata"
                                                        }
                                                      },
                                                      {
                                                        "argumentTypes": null,
                                                        "components": [
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4019,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "55173:7:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_type$_t_address_$",
                                                              "typeString": "type(address)"
                                                            },
                                                            "typeName": {
                                                              "id": 4018,
                                                              "name": "address",
                                                              "nodeType": "ElementaryTypeName",
                                                              "src": "55173:7:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": null,
                                                                "typeString": null
                                                              }
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4021,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "55182:7:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_type$_t_address_$",
                                                              "typeString": "type(address)"
                                                            },
                                                            "typeName": {
                                                              "id": 4020,
                                                              "name": "address",
                                                              "nodeType": "ElementaryTypeName",
                                                              "src": "55182:7:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": null,
                                                                "typeString": null
                                                              }
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4023,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "55191:4:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_type$_t_bool_$",
                                                              "typeString": "type(bool)"
                                                            },
                                                            "typeName": {
                                                              "id": 4022,
                                                              "name": "bool",
                                                              "nodeType": "ElementaryTypeName",
                                                              "src": "55191:4:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": null,
                                                                "typeString": null
                                                              }
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4025,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "55197:5:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_type$_t_uint8_$",
                                                              "typeString": "type(uint8)"
                                                            },
                                                            "typeName": {
                                                              "id": 4024,
                                                              "name": "uint8",
                                                              "nodeType": "ElementaryTypeName",
                                                              "src": "55197:5:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": null,
                                                                "typeString": null
                                                              }
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4027,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "55204:7:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_type$_t_bytes32_$",
                                                              "typeString": "type(bytes32)"
                                                            },
                                                            "typeName": {
                                                              "id": 4026,
                                                              "name": "bytes32",
                                                              "nodeType": "ElementaryTypeName",
                                                              "src": "55204:7:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": null,
                                                                "typeString": null
                                                              }
                                                            }
                                                          },
                                                          {
                                                            "argumentTypes": null,
                                                            "id": 4029,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "55213:7:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_type$_t_bytes32_$",
                                                              "typeString": "type(bytes32)"
                                                            },
                                                            "typeName": {
                                                              "id": 4028,
                                                              "name": "bytes32",
                                                              "nodeType": "ElementaryTypeName",
                                                              "src": "55213:7:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": null,
                                                                "typeString": null
                                                              }
                                                            }
                                                          }
                                                        ],
                                                        "id": 4030,
                                                        "isConstant": false,
                                                        "isInlineArray": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "TupleExpression",
                                                        "src": "55172:49:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_address_$_$_t_type$_t_bool_$_$_t_type$_t_uint8_$_$_t_type$_t_bytes32_$_$_t_type$_t_bytes32_$_$",
                                                          "typeString": "tuple(type(address),type(address),type(bool),type(uint8),type(bytes32),type(bytes32))"
                                                        }
                                                      }
                                                    ],
                                                    "expression": {
                                                      "argumentTypes": [
                                                        {
                                                          "typeIdentifier": "t_bytes_calldata_ptr",
                                                          "typeString": "bytes calldata"
                                                        },
                                                        {
                                                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_address_$_$_t_type$_t_bool_$_$_t_type$_t_uint8_$_$_t_type$_t_bytes32_$_$_t_type$_t_bytes32_$_$",
                                                          "typeString": "tuple(type(address),type(address),type(bool),type(uint8),type(bytes32),type(bytes32))"
                                                        }
                                                      ],
                                                      "expression": {
                                                        "argumentTypes": null,
                                                        "id": 4013,
                                                        "name": "abi",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": -1,
                                                        "src": "55151:3:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_magic_abi",
                                                          "typeString": "abi"
                                                        }
                                                      },
                                                      "id": 4014,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "lValueRequested": false,
                                                      "memberName": "decode",
                                                      "nodeType": "MemberAccess",
                                                      "referencedDeclaration": null,
                                                      "src": "55151:10:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                        "typeString": "function () pure"
                                                      }
                                                    },
                                                    "id": 4031,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "55151:71:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_tuple$_t_address_payable_$_t_address_payable_$_t_bool_$_t_uint8_$_t_bytes32_$_t_bytes32_$",
                                                      "typeString": "tuple(address payable,address payable,bool,uint8,bytes32,bytes32)"
                                                    }
                                                  },
                                                  "nodeType": "VariableDeclarationStatement",
                                                  "src": "55043:179:0"
                                                },
                                                {
                                                  "expression": {
                                                    "argumentTypes": null,
                                                    "arguments": [
                                                      {
                                                        "argumentTypes": null,
                                                        "id": 4036,
                                                        "name": "user",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4002,
                                                        "src": "55275:4:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_address",
                                                          "typeString": "address"
                                                        }
                                                      },
                                                      {
                                                        "argumentTypes": null,
                                                        "id": 4037,
                                                        "name": "_masterContract",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4004,
                                                        "src": "55281:15:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_address",
                                                          "typeString": "address"
                                                        }
                                                      },
                                                      {
                                                        "argumentTypes": null,
                                                        "id": 4038,
                                                        "name": "approved",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4006,
                                                        "src": "55298:8:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bool",
                                                          "typeString": "bool"
                                                        }
                                                      },
                                                      {
                                                        "argumentTypes": null,
                                                        "id": 4039,
                                                        "name": "v",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4008,
                                                        "src": "55308:1:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint8",
                                                          "typeString": "uint8"
                                                        }
                                                      },
                                                      {
                                                        "argumentTypes": null,
                                                        "id": 4040,
                                                        "name": "r",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4010,
                                                        "src": "55311:1:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bytes32",
                                                          "typeString": "bytes32"
                                                        }
                                                      },
                                                      {
                                                        "argumentTypes": null,
                                                        "id": 4041,
                                                        "name": "s",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 4012,
                                                        "src": "55314:1:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bytes32",
                                                          "typeString": "bytes32"
                                                        }
                                                      }
                                                    ],
                                                    "expression": {
                                                      "argumentTypes": [
                                                        {
                                                          "typeIdentifier": "t_address",
                                                          "typeString": "address"
                                                        },
                                                        {
                                                          "typeIdentifier": "t_address",
                                                          "typeString": "address"
                                                        },
                                                        {
                                                          "typeIdentifier": "t_bool",
                                                          "typeString": "bool"
                                                        },
                                                        {
                                                          "typeIdentifier": "t_uint8",
                                                          "typeString": "uint8"
                                                        },
                                                        {
                                                          "typeIdentifier": "t_bytes32",
                                                          "typeString": "bytes32"
                                                        },
                                                        {
                                                          "typeIdentifier": "t_bytes32",
                                                          "typeString": "bytes32"
                                                        }
                                                      ],
                                                      "expression": {
                                                        "argumentTypes": null,
                                                        "id": 4033,
                                                        "name": "bentoBox",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 1983,
                                                        "src": "55240:8:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                                          "typeString": "contract IBentoBoxV1"
                                                        }
                                                      },
                                                      "id": 4035,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "memberName": "setMasterContractApproval",
                                                      "nodeType": "MemberAccess",
                                                      "referencedDeclaration": 1670,
                                                      "src": "55240:34:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_bool_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$__$",
                                                        "typeString": "function (address,address,bool,uint8,bytes32,bytes32) external"
                                                      }
                                                    },
                                                    "id": 4042,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "55240:76:0",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_tuple$__$",
                                                      "typeString": "tuple()"
                                                    }
                                                  },
                                                  "id": 4043,
                                                  "nodeType": "ExpressionStatement",
                                                  "src": "55240:76:0"
                                                }
                                              ]
                                            }
                                          },
                                          "id": 4277,
                                          "nodeType": "IfStatement",
                                          "src": "54601:2389:0",
                                          "trueBody": {
                                            "id": 3997,
                                            "nodeType": "Block",
                                            "src": "54644:335:0",
                                            "statements": [
                                              {
                                                "assignments": [
                                                  3949,
                                                  3951,
                                                  3953
                                                ],
                                                "declarations": [
                                                  {
                                                    "constant": false,
                                                    "id": 3949,
                                                    "mutability": "mutable",
                                                    "name": "must_update",
                                                    "nodeType": "VariableDeclaration",
                                                    "overrides": null,
                                                    "scope": 3997,
                                                    "src": "54663:16:0",
                                                    "stateVariable": false,
                                                    "storageLocation": "default",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_bool",
                                                      "typeString": "bool"
                                                    },
                                                    "typeName": {
                                                      "id": 3948,
                                                      "name": "bool",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "54663:4:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                      }
                                                    },
                                                    "value": null,
                                                    "visibility": "internal"
                                                  },
                                                  {
                                                    "constant": false,
                                                    "id": 3951,
                                                    "mutability": "mutable",
                                                    "name": "minRate",
                                                    "nodeType": "VariableDeclaration",
                                                    "overrides": null,
                                                    "scope": 3997,
                                                    "src": "54681:15:0",
                                                    "stateVariable": false,
                                                    "storageLocation": "default",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    },
                                                    "typeName": {
                                                      "id": 3950,
                                                      "name": "uint256",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "54681:7:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    "value": null,
                                                    "visibility": "internal"
                                                  },
                                                  {
                                                    "constant": false,
                                                    "id": 3953,
                                                    "mutability": "mutable",
                                                    "name": "maxRate",
                                                    "nodeType": "VariableDeclaration",
                                                    "overrides": null,
                                                    "scope": 3997,
                                                    "src": "54698:15:0",
                                                    "stateVariable": false,
                                                    "storageLocation": "default",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    },
                                                    "typeName": {
                                                      "id": 3952,
                                                      "name": "uint256",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "54698:7:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    "value": null,
                                                    "visibility": "internal"
                                                  }
                                                ],
                                                "id": 3967,
                                                "initialValue": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "baseExpression": {
                                                        "argumentTypes": null,
                                                        "id": 3956,
                                                        "name": "datas",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 3691,
                                                        "src": "54728:5:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                          "typeString": "bytes calldata[] calldata"
                                                        }
                                                      },
                                                      "id": 3958,
                                                      "indexExpression": {
                                                        "argumentTypes": null,
                                                        "id": 3957,
                                                        "name": "i",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 3702,
                                                        "src": "54734:1:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint256",
                                                          "typeString": "uint256"
                                                        }
                                                      },
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "nodeType": "IndexAccess",
                                                      "src": "54728:8:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "components": [
                                                        {
                                                          "argumentTypes": null,
                                                          "id": 3960,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": true,
                                                          "lValueRequested": false,
                                                          "nodeType": "ElementaryTypeNameExpression",
                                                          "src": "54739:4:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_bool_$",
                                                            "typeString": "type(bool)"
                                                          },
                                                          "typeName": {
                                                            "id": 3959,
                                                            "name": "bool",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "54739:4:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": null,
                                                              "typeString": null
                                                            }
                                                          }
                                                        },
                                                        {
                                                          "argumentTypes": null,
                                                          "id": 3962,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": true,
                                                          "lValueRequested": false,
                                                          "nodeType": "ElementaryTypeNameExpression",
                                                          "src": "54745:7:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_uint256_$",
                                                            "typeString": "type(uint256)"
                                                          },
                                                          "typeName": {
                                                            "id": 3961,
                                                            "name": "uint256",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "54745:7:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": null,
                                                              "typeString": null
                                                            }
                                                          }
                                                        },
                                                        {
                                                          "argumentTypes": null,
                                                          "id": 3964,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": true,
                                                          "lValueRequested": false,
                                                          "nodeType": "ElementaryTypeNameExpression",
                                                          "src": "54754:7:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_uint256_$",
                                                            "typeString": "type(uint256)"
                                                          },
                                                          "typeName": {
                                                            "id": 3963,
                                                            "name": "uint256",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "54754:7:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": null,
                                                              "typeString": null
                                                            }
                                                          }
                                                        }
                                                      ],
                                                      "id": 3965,
                                                      "isConstant": false,
                                                      "isInlineArray": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "lValueRequested": false,
                                                      "nodeType": "TupleExpression",
                                                      "src": "54738:24:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$",
                                                        "typeString": "tuple(type(bool),type(uint256),type(uint256))"
                                                      }
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_tuple$_t_type$_t_bool_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$",
                                                        "typeString": "tuple(type(bool),type(uint256),type(uint256))"
                                                      }
                                                    ],
                                                    "expression": {
                                                      "argumentTypes": null,
                                                      "id": 3954,
                                                      "name": "abi",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": -1,
                                                      "src": "54717:3:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_abi",
                                                        "typeString": "abi"
                                                      }
                                                    },
                                                    "id": 3955,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "memberName": "decode",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": null,
                                                    "src": "54717:10:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                      "typeString": "function () pure"
                                                    }
                                                  },
                                                  "id": 3966,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "54717:46:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$_t_uint256_$",
                                                    "typeString": "tuple(bool,uint256,uint256)"
                                                  }
                                                },
                                                "nodeType": "VariableDeclarationStatement",
                                                "src": "54662:101:0"
                                              },
                                              {
                                                "assignments": [
                                                  3969,
                                                  3971
                                                ],
                                                "declarations": [
                                                  {
                                                    "constant": false,
                                                    "id": 3969,
                                                    "mutability": "mutable",
                                                    "name": "updated",
                                                    "nodeType": "VariableDeclaration",
                                                    "overrides": null,
                                                    "scope": 3997,
                                                    "src": "54782:12:0",
                                                    "stateVariable": false,
                                                    "storageLocation": "default",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_bool",
                                                      "typeString": "bool"
                                                    },
                                                    "typeName": {
                                                      "id": 3968,
                                                      "name": "bool",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "54782:4:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                      }
                                                    },
                                                    "value": null,
                                                    "visibility": "internal"
                                                  },
                                                  {
                                                    "constant": false,
                                                    "id": 3971,
                                                    "mutability": "mutable",
                                                    "name": "rate",
                                                    "nodeType": "VariableDeclaration",
                                                    "overrides": null,
                                                    "scope": 3997,
                                                    "src": "54796:12:0",
                                                    "stateVariable": false,
                                                    "storageLocation": "default",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    },
                                                    "typeName": {
                                                      "id": 3970,
                                                      "name": "uint256",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "54796:7:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    "value": null,
                                                    "visibility": "internal"
                                                  }
                                                ],
                                                "id": 3974,
                                                "initialValue": {
                                                  "argumentTypes": null,
                                                  "arguments": [],
                                                  "expression": {
                                                    "argumentTypes": [],
                                                    "id": 3972,
                                                    "name": "updateExchangeRate",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 2673,
                                                    "src": "54812:18:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_bool_$_t_uint256_$",
                                                      "typeString": "function () returns (bool,uint256)"
                                                    }
                                                  },
                                                  "id": 3973,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "54812:20:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                                                    "typeString": "tuple(bool,uint256)"
                                                  }
                                                },
                                                "nodeType": "VariableDeclarationStatement",
                                                "src": "54781:51:0"
                                              },
                                              {
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "commonType": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                      },
                                                      "id": 3993,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "leftExpression": {
                                                        "argumentTypes": null,
                                                        "commonType": {
                                                          "typeIdentifier": "t_bool",
                                                          "typeString": "bool"
                                                        },
                                                        "id": 3984,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "leftExpression": {
                                                          "argumentTypes": null,
                                                          "components": [
                                                            {
                                                              "argumentTypes": null,
                                                              "commonType": {
                                                                "typeIdentifier": "t_bool",
                                                                "typeString": "bool"
                                                              },
                                                              "id": 3979,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "lValueRequested": false,
                                                              "leftExpression": {
                                                                "argumentTypes": null,
                                                                "id": 3977,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": false,
                                                                "lValueRequested": false,
                                                                "nodeType": "UnaryOperation",
                                                                "operator": "!",
                                                                "prefix": true,
                                                                "src": "54859:12:0",
                                                                "subExpression": {
                                                                  "argumentTypes": null,
                                                                  "id": 3976,
                                                                  "name": "must_update",
                                                                  "nodeType": "Identifier",
                                                                  "overloadedDeclarations": [],
                                                                  "referencedDeclaration": 3949,
                                                                  "src": "54860:11:0",
                                                                  "typeDescriptions": {
                                                                    "typeIdentifier": "t_bool",
                                                                    "typeString": "bool"
                                                                  }
                                                                },
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_bool",
                                                                  "typeString": "bool"
                                                                }
                                                              },
                                                              "nodeType": "BinaryOperation",
                                                              "operator": "||",
                                                              "rightExpression": {
                                                                "argumentTypes": null,
                                                                "id": 3978,
                                                                "name": "updated",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3969,
                                                                "src": "54875:7:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_bool",
                                                                  "typeString": "bool"
                                                                }
                                                              },
                                                              "src": "54859:23:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_bool",
                                                                "typeString": "bool"
                                                              }
                                                            }
                                                          ],
                                                          "id": 3980,
                                                          "isConstant": false,
                                                          "isInlineArray": false,
                                                          "isLValue": false,
                                                          "isPure": false,
                                                          "lValueRequested": false,
                                                          "nodeType": "TupleExpression",
                                                          "src": "54858:25:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_bool",
                                                            "typeString": "bool"
                                                          }
                                                        },
                                                        "nodeType": "BinaryOperation",
                                                        "operator": "&&",
                                                        "rightExpression": {
                                                          "argumentTypes": null,
                                                          "commonType": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                          },
                                                          "id": 3983,
                                                          "isConstant": false,
                                                          "isLValue": false,
                                                          "isPure": false,
                                                          "lValueRequested": false,
                                                          "leftExpression": {
                                                            "argumentTypes": null,
                                                            "id": 3981,
                                                            "name": "rate",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3971,
                                                            "src": "54887:4:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          },
                                                          "nodeType": "BinaryOperation",
                                                          "operator": ">",
                                                          "rightExpression": {
                                                            "argumentTypes": null,
                                                            "id": 3982,
                                                            "name": "minRate",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 3951,
                                                            "src": "54894:7:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_uint256",
                                                              "typeString": "uint256"
                                                            }
                                                          },
                                                          "src": "54887:14:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_bool",
                                                            "typeString": "bool"
                                                          }
                                                        },
                                                        "src": "54858:43:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bool",
                                                          "typeString": "bool"
                                                        }
                                                      },
                                                      "nodeType": "BinaryOperation",
                                                      "operator": "&&",
                                                      "rightExpression": {
                                                        "argumentTypes": null,
                                                        "components": [
                                                          {
                                                            "argumentTypes": null,
                                                            "commonType": {
                                                              "typeIdentifier": "t_bool",
                                                              "typeString": "bool"
                                                            },
                                                            "id": 3991,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": false,
                                                            "lValueRequested": false,
                                                            "leftExpression": {
                                                              "argumentTypes": null,
                                                              "commonType": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              },
                                                              "id": 3987,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "lValueRequested": false,
                                                              "leftExpression": {
                                                                "argumentTypes": null,
                                                                "id": 3985,
                                                                "name": "maxRate",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3953,
                                                                "src": "54906:7:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_uint256",
                                                                  "typeString": "uint256"
                                                                }
                                                              },
                                                              "nodeType": "BinaryOperation",
                                                              "operator": "==",
                                                              "rightExpression": {
                                                                "argumentTypes": null,
                                                                "hexValue": "30",
                                                                "id": 3986,
                                                                "isConstant": false,
                                                                "isLValue": false,
                                                                "isPure": true,
                                                                "kind": "number",
                                                                "lValueRequested": false,
                                                                "nodeType": "Literal",
                                                                "src": "54917:1:0",
                                                                "subdenomination": null,
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_rational_0_by_1",
                                                                  "typeString": "int_const 0"
                                                                },
                                                                "value": "0"
                                                              },
                                                              "src": "54906:12:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_bool",
                                                                "typeString": "bool"
                                                              }
                                                            },
                                                            "nodeType": "BinaryOperation",
                                                            "operator": "||",
                                                            "rightExpression": {
                                                              "argumentTypes": null,
                                                              "commonType": {
                                                                "typeIdentifier": "t_uint256",
                                                                "typeString": "uint256"
                                                              },
                                                              "id": 3990,
                                                              "isConstant": false,
                                                              "isLValue": false,
                                                              "isPure": false,
                                                              "lValueRequested": false,
                                                              "leftExpression": {
                                                                "argumentTypes": null,
                                                                "id": 3988,
                                                                "name": "rate",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3971,
                                                                "src": "54922:4:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_uint256",
                                                                  "typeString": "uint256"
                                                                }
                                                              },
                                                              "nodeType": "BinaryOperation",
                                                              "operator": ">",
                                                              "rightExpression": {
                                                                "argumentTypes": null,
                                                                "id": 3989,
                                                                "name": "maxRate",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 3953,
                                                                "src": "54929:7:0",
                                                                "typeDescriptions": {
                                                                  "typeIdentifier": "t_uint256",
                                                                  "typeString": "uint256"
                                                                }
                                                              },
                                                              "src": "54922:14:0",
                                                              "typeDescriptions": {
                                                                "typeIdentifier": "t_bool",
                                                                "typeString": "bool"
                                                              }
                                                            },
                                                            "src": "54906:30:0",
                                                            "typeDescriptions": {
                                                              "typeIdentifier": "t_bool",
                                                              "typeString": "bool"
                                                            }
                                                          }
                                                        ],
                                                        "id": 3992,
                                                        "isConstant": false,
                                                        "isInlineArray": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "nodeType": "TupleExpression",
                                                        "src": "54905:32:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_bool",
                                                          "typeString": "bool"
                                                        }
                                                      },
                                                      "src": "54858:79:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "hexValue": "4b61736869506169723a2072617465206e6f74206f6b",
                                                      "id": 3994,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "kind": "string",
                                                      "lValueRequested": false,
                                                      "nodeType": "Literal",
                                                      "src": "54939:24:0",
                                                      "subdenomination": null,
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_stringliteral_f93f5921c6cae8bfcfeace55c8620363be5dbccf7d089e6843eac3dcef7436c5",
                                                        "typeString": "literal_string \"KashiPair: rate not ok\""
                                                      },
                                                      "value": "KashiPair: rate not ok"
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_stringliteral_f93f5921c6cae8bfcfeace55c8620363be5dbccf7d089e6843eac3dcef7436c5",
                                                        "typeString": "literal_string \"KashiPair: rate not ok\""
                                                      }
                                                    ],
                                                    "id": 3975,
                                                    "name": "require",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [
                                                      -18,
                                                      -18
                                                    ],
                                                    "referencedDeclaration": -18,
                                                    "src": "54850:7:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                                      "typeString": "function (bool,string memory) pure"
                                                    }
                                                  },
                                                  "id": 3995,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "54850:114:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$__$",
                                                    "typeString": "tuple()"
                                                  }
                                                },
                                                "id": 3996,
                                                "nodeType": "ExpressionStatement",
                                                "src": "54850:114:0"
                                              }
                                            ]
                                          }
                                        },
                                        "id": 4278,
                                        "nodeType": "IfStatement",
                                        "src": "54336:2654:0",
                                        "trueBody": {
                                          "id": 3944,
                                          "nodeType": "Block",
                                          "src": "54365:230:0",
                                          "statements": [
                                            {
                                              "assignments": [
                                                3910,
                                                3912
                                              ],
                                              "declarations": [
                                                {
                                                  "constant": false,
                                                  "id": 3910,
                                                  "mutability": "mutable",
                                                  "name": "amount",
                                                  "nodeType": "VariableDeclaration",
                                                  "overrides": null,
                                                  "scope": 3944,
                                                  "src": "54384:13:0",
                                                  "stateVariable": false,
                                                  "storageLocation": "default",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  },
                                                  "typeName": {
                                                    "id": 3909,
                                                    "name": "int256",
                                                    "nodeType": "ElementaryTypeName",
                                                    "src": "54384:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_int256",
                                                      "typeString": "int256"
                                                    }
                                                  },
                                                  "value": null,
                                                  "visibility": "internal"
                                                },
                                                {
                                                  "constant": false,
                                                  "id": 3912,
                                                  "mutability": "mutable",
                                                  "name": "to",
                                                  "nodeType": "VariableDeclaration",
                                                  "overrides": null,
                                                  "scope": 3944,
                                                  "src": "54399:10:0",
                                                  "stateVariable": false,
                                                  "storageLocation": "default",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  },
                                                  "typeName": {
                                                    "id": 3911,
                                                    "name": "address",
                                                    "nodeType": "ElementaryTypeName",
                                                    "src": "54399:7:0",
                                                    "stateMutability": "nonpayable",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_address",
                                                      "typeString": "address"
                                                    }
                                                  },
                                                  "value": null,
                                                  "visibility": "internal"
                                                }
                                              ],
                                              "id": 3924,
                                              "initialValue": {
                                                "argumentTypes": null,
                                                "arguments": [
                                                  {
                                                    "argumentTypes": null,
                                                    "baseExpression": {
                                                      "argumentTypes": null,
                                                      "id": 3915,
                                                      "name": "datas",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3691,
                                                      "src": "54424:5:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                        "typeString": "bytes calldata[] calldata"
                                                      }
                                                    },
                                                    "id": 3917,
                                                    "indexExpression": {
                                                      "argumentTypes": null,
                                                      "id": 3916,
                                                      "name": "i",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3702,
                                                      "src": "54430:1:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "nodeType": "IndexAccess",
                                                    "src": "54424:8:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                                      "typeString": "bytes calldata"
                                                    }
                                                  },
                                                  {
                                                    "argumentTypes": null,
                                                    "components": [
                                                      {
                                                        "argumentTypes": null,
                                                        "id": 3919,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "54435:6:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_type$_t_int256_$",
                                                          "typeString": "type(int256)"
                                                        },
                                                        "typeName": {
                                                          "id": 3918,
                                                          "name": "int256",
                                                          "nodeType": "ElementaryTypeName",
                                                          "src": "54435:6:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": null,
                                                            "typeString": null
                                                          }
                                                        }
                                                      },
                                                      {
                                                        "argumentTypes": null,
                                                        "id": 3921,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "54443:7:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_type$_t_address_$",
                                                          "typeString": "type(address)"
                                                        },
                                                        "typeName": {
                                                          "id": 3920,
                                                          "name": "address",
                                                          "nodeType": "ElementaryTypeName",
                                                          "src": "54443:7:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": null,
                                                            "typeString": null
                                                          }
                                                        }
                                                      }
                                                    ],
                                                    "id": 3922,
                                                    "isConstant": false,
                                                    "isInlineArray": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "nodeType": "TupleExpression",
                                                    "src": "54434:17:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$",
                                                      "typeString": "tuple(type(int256),type(address))"
                                                    }
                                                  }
                                                ],
                                                "expression": {
                                                  "argumentTypes": [
                                                    {
                                                      "typeIdentifier": "t_bytes_calldata_ptr",
                                                      "typeString": "bytes calldata"
                                                    },
                                                    {
                                                      "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$",
                                                      "typeString": "tuple(type(int256),type(address))"
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": null,
                                                    "id": 3913,
                                                    "name": "abi",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": -1,
                                                    "src": "54413:3:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_magic_abi",
                                                      "typeString": "abi"
                                                    }
                                                  },
                                                  "id": 3914,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "lValueRequested": false,
                                                  "memberName": "decode",
                                                  "nodeType": "MemberAccess",
                                                  "referencedDeclaration": null,
                                                  "src": "54413:10:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                    "typeString": "function () pure"
                                                  }
                                                },
                                                "id": 3923,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "54413:39:0",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_tuple$_t_int256_$_t_address_payable_$",
                                                  "typeString": "tuple(int256,address payable)"
                                                }
                                              },
                                              "nodeType": "VariableDeclarationStatement",
                                              "src": "54383:69:0"
                                            },
                                            {
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3936,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftHandSide": {
                                                  "argumentTypes": null,
                                                  "components": [
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3925,
                                                      "name": "value1",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3694,
                                                      "src": "54471:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3926,
                                                      "name": "value2",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3696,
                                                      "src": "54479:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    }
                                                  ],
                                                  "id": 3927,
                                                  "isConstant": false,
                                                  "isInlineArray": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": true,
                                                  "nodeType": "TupleExpression",
                                                  "src": "54470:16:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                                    "typeString": "tuple(uint256,uint256)"
                                                  }
                                                },
                                                "nodeType": "Assignment",
                                                "operator": "=",
                                                "rightHandSide": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3929,
                                                      "name": "to",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3912,
                                                      "src": "54497:2:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "arguments": [
                                                        {
                                                          "argumentTypes": null,
                                                          "id": 3931,
                                                          "name": "amount",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 3910,
                                                          "src": "54506:6:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_int256",
                                                            "typeString": "int256"
                                                          }
                                                        },
                                                        {
                                                          "argumentTypes": null,
                                                          "id": 3932,
                                                          "name": "value1",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 3694,
                                                          "src": "54514:6:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                          }
                                                        },
                                                        {
                                                          "argumentTypes": null,
                                                          "id": 3933,
                                                          "name": "value2",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 3696,
                                                          "src": "54522:6:0",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                          }
                                                        }
                                                      ],
                                                      "expression": {
                                                        "argumentTypes": [
                                                          {
                                                            "typeIdentifier": "t_int256",
                                                            "typeString": "int256"
                                                          },
                                                          {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                          },
                                                          {
                                                            "typeIdentifier": "t_uint256",
                                                            "typeString": "uint256"
                                                          }
                                                        ],
                                                        "id": 3930,
                                                        "name": "_num",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 3422,
                                                        "src": "54501:4:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                                          "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                                        }
                                                      },
                                                      "id": 3934,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "kind": "functionCall",
                                                      "lValueRequested": false,
                                                      "names": [],
                                                      "nodeType": "FunctionCall",
                                                      "src": "54501:28:0",
                                                      "tryCall": false,
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    ],
                                                    "id": 3928,
                                                    "name": "_borrow",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 3201,
                                                    "src": "54489:7:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                                      "typeString": "function (address,uint256) returns (uint256,uint256)"
                                                    }
                                                  },
                                                  "id": 3935,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "54489:41:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                                    "typeString": "tuple(uint256,uint256)"
                                                  }
                                                },
                                                "src": "54470:60:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_tuple$__$",
                                                  "typeString": "tuple()"
                                                }
                                              },
                                              "id": 3937,
                                              "nodeType": "ExpressionStatement",
                                              "src": "54470:60:0"
                                            },
                                            {
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3942,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftHandSide": {
                                                  "argumentTypes": null,
                                                  "expression": {
                                                    "argumentTypes": null,
                                                    "id": 3938,
                                                    "name": "status",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 3699,
                                                    "src": "54548:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_struct$_CookStatus_$3681_memory_ptr",
                                                      "typeString": "struct KashiPairMediumRiskV1.CookStatus memory"
                                                    }
                                                  },
                                                  "id": 3940,
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": true,
                                                  "memberName": "needsSolvencyCheck",
                                                  "nodeType": "MemberAccess",
                                                  "referencedDeclaration": 3678,
                                                  "src": "54548:25:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                  }
                                                },
                                                "nodeType": "Assignment",
                                                "operator": "=",
                                                "rightHandSide": {
                                                  "argumentTypes": null,
                                                  "hexValue": "74727565",
                                                  "id": 3941,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "kind": "bool",
                                                  "lValueRequested": false,
                                                  "nodeType": "Literal",
                                                  "src": "54576:4:0",
                                                  "subdenomination": null,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                  },
                                                  "value": "true"
                                                },
                                                "src": "54548:32:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                }
                                              },
                                              "id": 3943,
                                              "nodeType": "ExpressionStatement",
                                              "src": "54548:32:0"
                                            }
                                          ]
                                        }
                                      },
                                      "id": 4279,
                                      "nodeType": "IfStatement",
                                      "src": "54071:2919:0",
                                      "trueBody": {
                                        "id": 3905,
                                        "nodeType": "Block",
                                        "src": "54111:219:0",
                                        "statements": [
                                          {
                                            "assignments": [
                                              3875,
                                              3877
                                            ],
                                            "declarations": [
                                              {
                                                "constant": false,
                                                "id": 3875,
                                                "mutability": "mutable",
                                                "name": "share",
                                                "nodeType": "VariableDeclaration",
                                                "overrides": null,
                                                "scope": 3905,
                                                "src": "54130:12:0",
                                                "stateVariable": false,
                                                "storageLocation": "default",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_int256",
                                                  "typeString": "int256"
                                                },
                                                "typeName": {
                                                  "id": 3874,
                                                  "name": "int256",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "54130:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  }
                                                },
                                                "value": null,
                                                "visibility": "internal"
                                              },
                                              {
                                                "constant": false,
                                                "id": 3877,
                                                "mutability": "mutable",
                                                "name": "to",
                                                "nodeType": "VariableDeclaration",
                                                "overrides": null,
                                                "scope": 3905,
                                                "src": "54144:10:0",
                                                "stateVariable": false,
                                                "storageLocation": "default",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                },
                                                "typeName": {
                                                  "id": 3876,
                                                  "name": "address",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "54144:7:0",
                                                  "stateMutability": "nonpayable",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  }
                                                },
                                                "value": null,
                                                "visibility": "internal"
                                              }
                                            ],
                                            "id": 3889,
                                            "initialValue": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "baseExpression": {
                                                    "argumentTypes": null,
                                                    "id": 3880,
                                                    "name": "datas",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 3691,
                                                    "src": "54169:5:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                      "typeString": "bytes calldata[] calldata"
                                                    }
                                                  },
                                                  "id": 3882,
                                                  "indexExpression": {
                                                    "argumentTypes": null,
                                                    "id": 3881,
                                                    "name": "i",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 3702,
                                                    "src": "54175:1:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "nodeType": "IndexAccess",
                                                  "src": "54169:8:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "components": [
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3884,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "lValueRequested": false,
                                                      "nodeType": "ElementaryTypeNameExpression",
                                                      "src": "54180:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_int256_$",
                                                        "typeString": "type(int256)"
                                                      },
                                                      "typeName": {
                                                        "id": 3883,
                                                        "name": "int256",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "54180:6:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": null,
                                                          "typeString": null
                                                        }
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3886,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": true,
                                                      "lValueRequested": false,
                                                      "nodeType": "ElementaryTypeNameExpression",
                                                      "src": "54188:7:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_address_$",
                                                        "typeString": "type(address)"
                                                      },
                                                      "typeName": {
                                                        "id": 3885,
                                                        "name": "address",
                                                        "nodeType": "ElementaryTypeName",
                                                        "src": "54188:7:0",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": null,
                                                          "typeString": null
                                                        }
                                                      }
                                                    }
                                                  ],
                                                  "id": 3887,
                                                  "isConstant": false,
                                                  "isInlineArray": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "lValueRequested": false,
                                                  "nodeType": "TupleExpression",
                                                  "src": "54179:17:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$",
                                                    "typeString": "tuple(type(int256),type(address))"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$",
                                                    "typeString": "tuple(type(int256),type(address))"
                                                  }
                                                ],
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 3878,
                                                  "name": "abi",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": -1,
                                                  "src": "54158:3:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_magic_abi",
                                                    "typeString": "abi"
                                                  }
                                                },
                                                "id": 3879,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "memberName": "decode",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": null,
                                                "src": "54158:10:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                  "typeString": "function () pure"
                                                }
                                              },
                                              "id": 3888,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "54158:39:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_int256_$_t_address_payable_$",
                                                "typeString": "tuple(int256,address payable)"
                                              }
                                            },
                                            "nodeType": "VariableDeclarationStatement",
                                            "src": "54129:68:0"
                                          },
                                          {
                                            "expression": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3891,
                                                  "name": "to",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3877,
                                                  "src": "54233:2:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3893,
                                                      "name": "share",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3875,
                                                      "src": "54242:5:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_int256",
                                                        "typeString": "int256"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3894,
                                                      "name": "value1",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3694,
                                                      "src": "54249:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3895,
                                                      "name": "value2",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3696,
                                                      "src": "54257:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_int256",
                                                        "typeString": "int256"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    ],
                                                    "id": 3892,
                                                    "name": "_num",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 3422,
                                                    "src": "54237:4:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                                      "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                                    }
                                                  },
                                                  "id": 3896,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "54237:27:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                ],
                                                "id": 3890,
                                                "name": "_removeCollateral",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2821,
                                                "src": "54215:17:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                                  "typeString": "function (address,uint256)"
                                                }
                                              },
                                              "id": 3897,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "54215:50:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$__$",
                                                "typeString": "tuple()"
                                              }
                                            },
                                            "id": 3898,
                                            "nodeType": "ExpressionStatement",
                                            "src": "54215:50:0"
                                          },
                                          {
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 3903,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "leftHandSide": {
                                                "argumentTypes": null,
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 3899,
                                                  "name": "status",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3699,
                                                  "src": "54283:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_CookStatus_$3681_memory_ptr",
                                                    "typeString": "struct KashiPairMediumRiskV1.CookStatus memory"
                                                  }
                                                },
                                                "id": 3901,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": true,
                                                "memberName": "needsSolvencyCheck",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 3678,
                                                "src": "54283:25:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                }
                                              },
                                              "nodeType": "Assignment",
                                              "operator": "=",
                                              "rightHandSide": {
                                                "argumentTypes": null,
                                                "hexValue": "74727565",
                                                "id": 3902,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "bool",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "54311:4:0",
                                                "subdenomination": null,
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bool",
                                                  "typeString": "bool"
                                                },
                                                "value": "true"
                                              },
                                              "src": "54283:32:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              }
                                            },
                                            "id": 3904,
                                            "nodeType": "ExpressionStatement",
                                            "src": "54283:32:0"
                                          }
                                        ]
                                      }
                                    },
                                    "id": 4280,
                                    "nodeType": "IfStatement",
                                    "src": "53851:3139:0",
                                    "trueBody": {
                                      "id": 3870,
                                      "nodeType": "Block",
                                      "src": "53886:179:0",
                                      "statements": [
                                        {
                                          "assignments": [
                                            3844,
                                            3846
                                          ],
                                          "declarations": [
                                            {
                                              "constant": false,
                                              "id": 3844,
                                              "mutability": "mutable",
                                              "name": "fraction",
                                              "nodeType": "VariableDeclaration",
                                              "overrides": null,
                                              "scope": 3870,
                                              "src": "53905:15:0",
                                              "stateVariable": false,
                                              "storageLocation": "default",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_int256",
                                                "typeString": "int256"
                                              },
                                              "typeName": {
                                                "id": 3843,
                                                "name": "int256",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "53905:6:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_int256",
                                                  "typeString": "int256"
                                                }
                                              },
                                              "value": null,
                                              "visibility": "internal"
                                            },
                                            {
                                              "constant": false,
                                              "id": 3846,
                                              "mutability": "mutable",
                                              "name": "to",
                                              "nodeType": "VariableDeclaration",
                                              "overrides": null,
                                              "scope": 3870,
                                              "src": "53922:10:0",
                                              "stateVariable": false,
                                              "storageLocation": "default",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              },
                                              "typeName": {
                                                "id": 3845,
                                                "name": "address",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "53922:7:0",
                                                "stateMutability": "nonpayable",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              },
                                              "value": null,
                                              "visibility": "internal"
                                            }
                                          ],
                                          "id": 3858,
                                          "initialValue": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "baseExpression": {
                                                  "argumentTypes": null,
                                                  "id": 3849,
                                                  "name": "datas",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3691,
                                                  "src": "53947:5:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                    "typeString": "bytes calldata[] calldata"
                                                  }
                                                },
                                                "id": 3851,
                                                "indexExpression": {
                                                  "argumentTypes": null,
                                                  "id": 3850,
                                                  "name": "i",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3702,
                                                  "src": "53953:1:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "IndexAccess",
                                                "src": "53947:8:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                                  "typeString": "bytes calldata"
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "components": [
                                                  {
                                                    "argumentTypes": null,
                                                    "id": 3853,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "nodeType": "ElementaryTypeNameExpression",
                                                    "src": "53958:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_type$_t_int256_$",
                                                      "typeString": "type(int256)"
                                                    },
                                                    "typeName": {
                                                      "id": 3852,
                                                      "name": "int256",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "53958:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": null,
                                                        "typeString": null
                                                      }
                                                    }
                                                  },
                                                  {
                                                    "argumentTypes": null,
                                                    "id": 3855,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "lValueRequested": false,
                                                    "nodeType": "ElementaryTypeNameExpression",
                                                    "src": "53966:7:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_type$_t_address_$",
                                                      "typeString": "type(address)"
                                                    },
                                                    "typeName": {
                                                      "id": 3854,
                                                      "name": "address",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "53966:7:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": null,
                                                        "typeString": null
                                                      }
                                                    }
                                                  }
                                                ],
                                                "id": 3856,
                                                "isConstant": false,
                                                "isInlineArray": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "TupleExpression",
                                                "src": "53957:17:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$",
                                                  "typeString": "tuple(type(int256),type(address))"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                                  "typeString": "bytes calldata"
                                                },
                                                {
                                                  "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$",
                                                  "typeString": "tuple(type(int256),type(address))"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 3847,
                                                "name": "abi",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": -1,
                                                "src": "53936:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_magic_abi",
                                                  "typeString": "abi"
                                                }
                                              },
                                              "id": 3848,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "memberName": "decode",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": null,
                                              "src": "53936:10:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                                "typeString": "function () pure"
                                              }
                                            },
                                            "id": 3857,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "53936:39:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_tuple$_t_int256_$_t_address_payable_$",
                                              "typeString": "tuple(int256,address payable)"
                                            }
                                          },
                                          "nodeType": "VariableDeclarationStatement",
                                          "src": "53904:71:0"
                                        },
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 3868,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftHandSide": {
                                              "argumentTypes": null,
                                              "id": 3859,
                                              "name": "value1",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3694,
                                              "src": "53993:6:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "Assignment",
                                            "operator": "=",
                                            "rightHandSide": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3861,
                                                  "name": "to",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3846,
                                                  "src": "54015:2:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3863,
                                                      "name": "fraction",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3844,
                                                      "src": "54024:8:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_int256",
                                                        "typeString": "int256"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3864,
                                                      "name": "value1",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3694,
                                                      "src": "54034:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 3865,
                                                      "name": "value2",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 3696,
                                                      "src": "54042:6:0",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_int256",
                                                        "typeString": "int256"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    ],
                                                    "id": 3862,
                                                    "name": "_num",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 3422,
                                                    "src": "54019:4:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                                      "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                                    }
                                                  },
                                                  "id": 3866,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "54019:30:0",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                ],
                                                "id": 3860,
                                                "name": "_removeAsset",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3074,
                                                "src": "54002:12:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_uint256_$",
                                                  "typeString": "function (address,uint256) returns (uint256)"
                                                }
                                              },
                                              "id": 3867,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "54002:48:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "53993:57:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 3869,
                                          "nodeType": "ExpressionStatement",
                                          "src": "53993:57:0"
                                        }
                                      ]
                                    }
                                  },
                                  "id": 4281,
                                  "nodeType": "IfStatement",
                                  "src": "53638:3352:0",
                                  "trueBody": {
                                    "id": 3839,
                                    "nodeType": "Block",
                                    "src": "53666:179:0",
                                    "statements": [
                                      {
                                        "assignments": [
                                          3810,
                                          3812,
                                          3814
                                        ],
                                        "declarations": [
                                          {
                                            "constant": false,
                                            "id": 3810,
                                            "mutability": "mutable",
                                            "name": "part",
                                            "nodeType": "VariableDeclaration",
                                            "overrides": null,
                                            "scope": 3839,
                                            "src": "53685:11:0",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_int256",
                                              "typeString": "int256"
                                            },
                                            "typeName": {
                                              "id": 3809,
                                              "name": "int256",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "53685:6:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_int256",
                                                "typeString": "int256"
                                              }
                                            },
                                            "value": null,
                                            "visibility": "internal"
                                          },
                                          {
                                            "constant": false,
                                            "id": 3812,
                                            "mutability": "mutable",
                                            "name": "to",
                                            "nodeType": "VariableDeclaration",
                                            "overrides": null,
                                            "scope": 3839,
                                            "src": "53698:10:0",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            },
                                            "typeName": {
                                              "id": 3811,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "53698:7:0",
                                              "stateMutability": "nonpayable",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            },
                                            "value": null,
                                            "visibility": "internal"
                                          },
                                          {
                                            "constant": false,
                                            "id": 3814,
                                            "mutability": "mutable",
                                            "name": "skim",
                                            "nodeType": "VariableDeclaration",
                                            "overrides": null,
                                            "scope": 3839,
                                            "src": "53710:9:0",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            },
                                            "typeName": {
                                              "id": 3813,
                                              "name": "bool",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "53710:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              }
                                            },
                                            "value": null,
                                            "visibility": "internal"
                                          }
                                        ],
                                        "id": 3828,
                                        "initialValue": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 3817,
                                                "name": "datas",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3691,
                                                "src": "53734:5:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                  "typeString": "bytes calldata[] calldata"
                                                }
                                              },
                                              "id": 3819,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 3818,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3702,
                                                "src": "53740:1:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "53734:8:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                "typeString": "bytes calldata"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "components": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3821,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "lValueRequested": false,
                                                  "nodeType": "ElementaryTypeNameExpression",
                                                  "src": "53745:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_int256_$",
                                                    "typeString": "type(int256)"
                                                  },
                                                  "typeName": {
                                                    "id": 3820,
                                                    "name": "int256",
                                                    "nodeType": "ElementaryTypeName",
                                                    "src": "53745:6:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": null,
                                                      "typeString": null
                                                    }
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3823,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "lValueRequested": false,
                                                  "nodeType": "ElementaryTypeNameExpression",
                                                  "src": "53753:7:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_address_$",
                                                    "typeString": "type(address)"
                                                  },
                                                  "typeName": {
                                                    "id": 3822,
                                                    "name": "address",
                                                    "nodeType": "ElementaryTypeName",
                                                    "src": "53753:7:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": null,
                                                      "typeString": null
                                                    }
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3825,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "lValueRequested": false,
                                                  "nodeType": "ElementaryTypeNameExpression",
                                                  "src": "53762:4:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_bool_$",
                                                    "typeString": "type(bool)"
                                                  },
                                                  "typeName": {
                                                    "id": 3824,
                                                    "name": "bool",
                                                    "nodeType": "ElementaryTypeName",
                                                    "src": "53762:4:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": null,
                                                      "typeString": null
                                                    }
                                                  }
                                                }
                                              ],
                                              "id": 3826,
                                              "isConstant": false,
                                              "isInlineArray": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "TupleExpression",
                                              "src": "53744:23:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$_t_type$_t_bool_$_$",
                                                "typeString": "tuple(type(int256),type(address),type(bool))"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                "typeString": "bytes calldata"
                                              },
                                              {
                                                "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$_t_type$_t_bool_$_$",
                                                "typeString": "tuple(type(int256),type(address),type(bool))"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 3815,
                                              "name": "abi",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -1,
                                              "src": "53723:3:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_magic_abi",
                                                "typeString": "abi"
                                              }
                                            },
                                            "id": 3816,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "memberName": "decode",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": null,
                                            "src": "53723:10:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                              "typeString": "function () pure"
                                            }
                                          },
                                          "id": 3827,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "53723:45:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$_t_int256_$_t_address_payable_$_t_bool_$",
                                            "typeString": "tuple(int256,address payable,bool)"
                                          }
                                        },
                                        "nodeType": "VariableDeclarationStatement",
                                        "src": "53684:84:0"
                                      },
                                      {
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 3830,
                                              "name": "to",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3812,
                                              "src": "53793:2:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "id": 3831,
                                              "name": "skim",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3814,
                                              "src": "53797:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3833,
                                                  "name": "part",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3810,
                                                  "src": "53808:4:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3834,
                                                  "name": "value1",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3694,
                                                  "src": "53814:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3835,
                                                  "name": "value2",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3696,
                                                  "src": "53822:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                ],
                                                "id": 3832,
                                                "name": "_num",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3422,
                                                "src": "53803:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                                  "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                                }
                                              },
                                              "id": 3836,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "53803:26:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              },
                                              {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              },
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "id": 3829,
                                            "name": "_repay",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3311,
                                            "src": "53786:6:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$_t_uint256_$returns$_t_uint256_$",
                                              "typeString": "function (address,bool,uint256) returns (uint256)"
                                            }
                                          },
                                          "id": 3837,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "53786:44:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 3838,
                                        "nodeType": "ExpressionStatement",
                                        "src": "53786:44:0"
                                      }
                                    ]
                                  }
                                },
                                "id": 4282,
                                "nodeType": "IfStatement",
                                "src": "53407:3583:0",
                                "trueBody": {
                                  "id": 3805,
                                  "nodeType": "Block",
                                  "src": "53439:193:0",
                                  "statements": [
                                    {
                                      "assignments": [
                                        3774,
                                        3776,
                                        3778
                                      ],
                                      "declarations": [
                                        {
                                          "constant": false,
                                          "id": 3774,
                                          "mutability": "mutable",
                                          "name": "share",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 3805,
                                          "src": "53458:12:0",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_int256",
                                            "typeString": "int256"
                                          },
                                          "typeName": {
                                            "id": 3773,
                                            "name": "int256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "53458:6:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_int256",
                                              "typeString": "int256"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        },
                                        {
                                          "constant": false,
                                          "id": 3776,
                                          "mutability": "mutable",
                                          "name": "to",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 3805,
                                          "src": "53472:10:0",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          "typeName": {
                                            "id": 3775,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "53472:7:0",
                                            "stateMutability": "nonpayable",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        },
                                        {
                                          "constant": false,
                                          "id": 3778,
                                          "mutability": "mutable",
                                          "name": "skim",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 3805,
                                          "src": "53484:9:0",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          "typeName": {
                                            "id": 3777,
                                            "name": "bool",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "53484:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        }
                                      ],
                                      "id": 3792,
                                      "initialValue": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "baseExpression": {
                                              "argumentTypes": null,
                                              "id": 3781,
                                              "name": "datas",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3691,
                                              "src": "53508:5:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                                "typeString": "bytes calldata[] calldata"
                                              }
                                            },
                                            "id": 3783,
                                            "indexExpression": {
                                              "argumentTypes": null,
                                              "id": 3782,
                                              "name": "i",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3702,
                                              "src": "53514:1:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "nodeType": "IndexAccess",
                                            "src": "53508:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bytes_calldata_ptr",
                                              "typeString": "bytes calldata"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "components": [
                                              {
                                                "argumentTypes": null,
                                                "id": 3785,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "53519:6:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_int256_$",
                                                  "typeString": "type(int256)"
                                                },
                                                "typeName": {
                                                  "id": 3784,
                                                  "name": "int256",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "53519:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": null,
                                                    "typeString": null
                                                  }
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 3787,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "53527:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_address_$",
                                                  "typeString": "type(address)"
                                                },
                                                "typeName": {
                                                  "id": 3786,
                                                  "name": "address",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "53527:7:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": null,
                                                    "typeString": null
                                                  }
                                                }
                                              },
                                              {
                                                "argumentTypes": null,
                                                "id": 3789,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "53536:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_bool_$",
                                                  "typeString": "type(bool)"
                                                },
                                                "typeName": {
                                                  "id": 3788,
                                                  "name": "bool",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "53536:4:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": null,
                                                    "typeString": null
                                                  }
                                                }
                                              }
                                            ],
                                            "id": 3790,
                                            "isConstant": false,
                                            "isInlineArray": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "TupleExpression",
                                            "src": "53518:23:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$_t_type$_t_bool_$_$",
                                              "typeString": "tuple(type(int256),type(address),type(bool))"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_bytes_calldata_ptr",
                                              "typeString": "bytes calldata"
                                            },
                                            {
                                              "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$_t_type$_t_bool_$_$",
                                              "typeString": "tuple(type(int256),type(address),type(bool))"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 3779,
                                            "name": "abi",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": -1,
                                            "src": "53497:3:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_magic_abi",
                                              "typeString": "abi"
                                            }
                                          },
                                          "id": 3780,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "memberName": "decode",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": null,
                                          "src": "53497:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                            "typeString": "function () pure"
                                          }
                                        },
                                        "id": 3791,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "53497:45:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_tuple$_t_int256_$_t_address_payable_$_t_bool_$",
                                          "typeString": "tuple(int256,address payable,bool)"
                                        }
                                      },
                                      "nodeType": "VariableDeclarationStatement",
                                      "src": "53457:85:0"
                                    },
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 3803,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "id": 3793,
                                          "name": "value1",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3694,
                                          "src": "53560:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 3795,
                                              "name": "to",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3776,
                                              "src": "53579:2:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "id": 3796,
                                              "name": "skim",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3778,
                                              "src": "53583:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3798,
                                                  "name": "share",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3774,
                                                  "src": "53594:5:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3799,
                                                  "name": "value1",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3694,
                                                  "src": "53601:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                {
                                                  "argumentTypes": null,
                                                  "id": 3800,
                                                  "name": "value2",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 3696,
                                                  "src": "53609:6:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_int256",
                                                    "typeString": "int256"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  },
                                                  {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                ],
                                                "id": 3797,
                                                "name": "_num",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 3422,
                                                "src": "53589:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                                  "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                                }
                                              },
                                              "id": 3801,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "53589:27:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              },
                                              {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              },
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "id": 3794,
                                            "name": "_addAsset",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2943,
                                            "src": "53569:9:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$_t_uint256_$returns$_t_uint256_$",
                                              "typeString": "function (address,bool,uint256) returns (uint256)"
                                            }
                                          },
                                          "id": 3802,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "53569:48:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "53560:57:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 3804,
                                      "nodeType": "ExpressionStatement",
                                      "src": "53560:57:0"
                                    }
                                  ]
                                }
                              },
                              "id": 4283,
                              "nodeType": "IfStatement",
                              "src": "53176:3814:0",
                              "trueBody": {
                                "id": 3769,
                                "nodeType": "Block",
                                "src": "53213:188:0",
                                "statements": [
                                  {
                                    "assignments": [
                                      3740,
                                      3742,
                                      3744
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 3740,
                                        "mutability": "mutable",
                                        "name": "share",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 3769,
                                        "src": "53232:12:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_int256",
                                          "typeString": "int256"
                                        },
                                        "typeName": {
                                          "id": 3739,
                                          "name": "int256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "53232:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_int256",
                                            "typeString": "int256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      },
                                      {
                                        "constant": false,
                                        "id": 3742,
                                        "mutability": "mutable",
                                        "name": "to",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 3769,
                                        "src": "53246:10:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        "typeName": {
                                          "id": 3741,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "53246:7:0",
                                          "stateMutability": "nonpayable",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      },
                                      {
                                        "constant": false,
                                        "id": 3744,
                                        "mutability": "mutable",
                                        "name": "skim",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 3769,
                                        "src": "53258:9:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        "typeName": {
                                          "id": 3743,
                                          "name": "bool",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "53258:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 3758,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 3747,
                                            "name": "datas",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3691,
                                            "src": "53282:5:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                                              "typeString": "bytes calldata[] calldata"
                                            }
                                          },
                                          "id": 3749,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 3748,
                                            "name": "i",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3702,
                                            "src": "53288:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "53282:8:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                            "typeString": "bytes calldata"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "components": [
                                            {
                                              "argumentTypes": null,
                                              "id": 3751,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "53293:6:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_int256_$",
                                                "typeString": "type(int256)"
                                              },
                                              "typeName": {
                                                "id": 3750,
                                                "name": "int256",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "53293:6:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "id": 3753,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "53301:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_address_$",
                                                "typeString": "type(address)"
                                              },
                                              "typeName": {
                                                "id": 3752,
                                                "name": "address",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "53301:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "id": 3755,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "53310:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_bool_$",
                                                "typeString": "type(bool)"
                                              },
                                              "typeName": {
                                                "id": 3754,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "53310:4:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            }
                                          ],
                                          "id": 3756,
                                          "isConstant": false,
                                          "isInlineArray": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "TupleExpression",
                                          "src": "53292:23:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$_t_type$_t_bool_$_$",
                                            "typeString": "tuple(type(int256),type(address),type(bool))"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes_calldata_ptr",
                                            "typeString": "bytes calldata"
                                          },
                                          {
                                            "typeIdentifier": "t_tuple$_t_type$_t_int256_$_$_t_type$_t_address_$_$_t_type$_t_bool_$_$",
                                            "typeString": "tuple(type(int256),type(address),type(bool))"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 3745,
                                          "name": "abi",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -1,
                                          "src": "53271:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_abi",
                                            "typeString": "abi"
                                          }
                                        },
                                        "id": 3746,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "decode",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "53271:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                          "typeString": "function () pure"
                                        }
                                      },
                                      "id": 3757,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "53271:45:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$_t_int256_$_t_address_payable_$_t_bool_$",
                                        "typeString": "tuple(int256,address payable,bool)"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "53231:85:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 3760,
                                          "name": "to",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3742,
                                          "src": "53348:2:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 3761,
                                          "name": "skim",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3744,
                                          "src": "53352:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 3763,
                                              "name": "share",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3740,
                                              "src": "53363:5:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_int256",
                                                "typeString": "int256"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "id": 3764,
                                              "name": "value1",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3694,
                                              "src": "53370:6:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "id": 3765,
                                              "name": "value2",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3696,
                                              "src": "53378:6:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_int256",
                                                "typeString": "int256"
                                              },
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "id": 3762,
                                            "name": "_num",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3422,
                                            "src": "53358:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                              "typeString": "function (int256,uint256,uint256) pure returns (uint256)"
                                            }
                                          },
                                          "id": 3766,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "53358:27:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 3759,
                                        "name": "addCollateral",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2773,
                                        "src": "53334:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$_t_uint256_$returns$__$",
                                          "typeString": "function (address,bool,uint256)"
                                        }
                                      },
                                      "id": 3767,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "53334:52:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3768,
                                    "nodeType": "ExpressionStatement",
                                    "src": "53334:52:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3708,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 3705,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3702,
                            "src": "52963:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3706,
                              "name": "actions",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3685,
                              "src": "52967:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint8_$dyn_calldata_ptr",
                                "typeString": "uint8[] calldata"
                              }
                            },
                            "id": 3707,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "52967:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "52963:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 4285,
                        "initializationExpression": {
                          "assignments": [
                            3702
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 3702,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 4285,
                              "src": "52948:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 3701,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "52948:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 3704,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 3703,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "52960:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "52948:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 3710,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "52983:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 3709,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3702,
                              "src": "52983:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 3711,
                          "nodeType": "ExpressionStatement",
                          "src": "52983:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "52943:4057:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4286,
                            "name": "status",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3699,
                            "src": "57014:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CookStatus_$3681_memory_ptr",
                              "typeString": "struct KashiPairMediumRiskV1.CookStatus memory"
                            }
                          },
                          "id": 4287,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "needsSolvencyCheck",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3678,
                          "src": "57014:25:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 4299,
                        "nodeType": "IfStatement",
                        "src": "57010:137:0",
                        "trueBody": {
                          "id": 4298,
                          "nodeType": "Block",
                          "src": "57041:106:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 4290,
                                          "name": "msg",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -15,
                                          "src": "57074:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_message",
                                            "typeString": "msg"
                                          }
                                        },
                                        "id": 4291,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sender",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "57074:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "hexValue": "66616c7365",
                                        "id": 4292,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "bool",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "57086:5:0",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        "value": "false"
                                      },
                                      {
                                        "argumentTypes": null,
                                        "id": 4293,
                                        "name": "exchangeRate",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2016,
                                        "src": "57093:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        },
                                        {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "id": 4289,
                                      "name": "_isSolvent",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2624,
                                      "src": "57063:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_bool_$_t_uint256_$returns$_t_bool_$",
                                        "typeString": "function (address,bool,uint256) view returns (bool)"
                                      }
                                    },
                                    "id": 4294,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "57063:43:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4b61736869506169723a207573657220696e736f6c76656e74",
                                    "id": 4295,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "57108:27:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_96328fa1bc54bf00ff9aaae06961f863040f54ceea1d5b43b4aca6d4f3fe04f9",
                                      "typeString": "literal_string \"KashiPair: user insolvent\""
                                    },
                                    "value": "KashiPair: user insolvent"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_96328fa1bc54bf00ff9aaae06961f863040f54ceea1d5b43b4aca6d4f3fe04f9",
                                      "typeString": "literal_string \"KashiPair: user insolvent\""
                                    }
                                  ],
                                  "id": 4288,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "57055:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 4296,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "57055:81:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4297,
                              "nodeType": "ExpressionStatement",
                              "src": "57055:81:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3682,
                    "nodeType": "StructuredDocumentation",
                    "src": "51984:731:0",
                    "text": "@notice Executes a set of actions and allows composability (contract calls) to other contracts.\n @param actions An array with a sequence of actions to execute (see ACTION_ declarations).\n @param values A one-to-one mapped array to `actions`. ETH amounts to send along with the actions.\n Only applicable to `ACTION_CALL`, `ACTION_BENTO_DEPOSIT`.\n @param datas A one-to-one mapped array to `actions`. Contains abi encoded data of function arguments.\n @return value1 May contain the first positioned return value of the last executed action (if applicable).\n @return value2 May contain the second positioned return value of the last executed action which returns 2 values (if applicable)."
                  },
                  "functionSelector": "656f3d64",
                  "id": 4301,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "cook",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3692,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3685,
                        "mutability": "mutable",
                        "name": "actions",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4301,
                        "src": "52743:24:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint8_$dyn_calldata_ptr",
                          "typeString": "uint8[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 3683,
                            "name": "uint8",
                            "nodeType": "ElementaryTypeName",
                            "src": "52743:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "id": 3684,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "52743:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint8_$dyn_storage_ptr",
                            "typeString": "uint8[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3688,
                        "mutability": "mutable",
                        "name": "values",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4301,
                        "src": "52777:25:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 3686,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "52777:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 3687,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "52777:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3691,
                        "mutability": "mutable",
                        "name": "datas",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4301,
                        "src": "52812:22:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr",
                          "typeString": "bytes[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 3689,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "52812:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_storage_ptr",
                              "typeString": "bytes"
                            }
                          },
                          "id": 3690,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "52812:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes_storage_$dyn_storage_ptr",
                            "typeString": "bytes[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "52733:107:0"
                  },
                  "returnParameters": {
                    "id": 3697,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3694,
                        "mutability": "mutable",
                        "name": "value1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4301,
                        "src": "52867:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3693,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "52867:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3696,
                        "mutability": "mutable",
                        "name": "value2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4301,
                        "src": "52883:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3695,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "52883:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "52866:32:0"
                  },
                  "scope": 4810,
                  "src": "52720:4433:0",
                  "stateMutability": "payable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 4733,
                    "nodeType": "Block",
                    "src": "57928:3958:0",
                    "statements": [
                      {
                        "assignments": [
                          null,
                          4318
                        ],
                        "declarations": [
                          null,
                          {
                            "constant": false,
                            "id": 4318,
                            "mutability": "mutable",
                            "name": "_exchangeRate",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4733,
                            "src": "58008:21:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 4317,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "58008:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4321,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 4319,
                            "name": "updateExchangeRate",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2673,
                            "src": "58033:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_bool_$_t_uint256_$",
                              "typeString": "function () returns (bool,uint256)"
                            }
                          },
                          "id": 4320,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58033:20:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "58005:48:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 4322,
                            "name": "accrue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2553,
                            "src": "58063:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 4323,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58063:8:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4324,
                        "nodeType": "ExpressionStatement",
                        "src": "58063:8:0"
                      },
                      {
                        "assignments": [
                          4326
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4326,
                            "mutability": "mutable",
                            "name": "allCollateralShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4733,
                            "src": "58082:26:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 4325,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "58082:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4327,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "58082:26:0"
                      },
                      {
                        "assignments": [
                          4329
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4329,
                            "mutability": "mutable",
                            "name": "allBorrowAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4733,
                            "src": "58118:23:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 4328,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "58118:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4330,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "58118:23:0"
                      },
                      {
                        "assignments": [
                          4332
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4332,
                            "mutability": "mutable",
                            "name": "allBorrowPart",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4733,
                            "src": "58151:21:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 4331,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "58151:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4333,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "58151:21:0"
                      },
                      {
                        "assignments": [
                          4335
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4335,
                            "mutability": "mutable",
                            "name": "_totalBorrow",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4733,
                            "src": "58182:26:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 4334,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 753,
                              "src": "58182:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4337,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 4336,
                          "name": "totalBorrow",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2005,
                          "src": "58211:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "58182:40:0"
                      },
                      {
                        "assignments": [
                          4339
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4339,
                            "mutability": "mutable",
                            "name": "bentoBoxTotals",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4733,
                            "src": "58232:28:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 4338,
                              "name": "Rebase",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 753,
                              "src": "58232:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_storage_ptr",
                                "typeString": "struct Rebase"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4344,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4342,
                              "name": "collateral",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1993,
                              "src": "58279:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 4340,
                              "name": "bentoBox",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1983,
                              "src": "58263:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                "typeString": "contract IBentoBoxV1"
                              }
                            },
                            "id": 4341,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "totals",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1731,
                            "src": "58263:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$returns$_t_struct$_Rebase_$753_memory_ptr_$",
                              "typeString": "function (contract IERC20) view external returns (struct Rebase memory)"
                            }
                          },
                          "id": 4343,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58263:27:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                            "typeString": "struct Rebase memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "58232:58:0"
                      },
                      {
                        "body": {
                          "id": 4495,
                          "nodeType": "Block",
                          "src": "58343:1423:0",
                          "statements": [
                            {
                              "assignments": [
                                4357
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 4357,
                                  "mutability": "mutable",
                                  "name": "user",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 4495,
                                  "src": "58357:12:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 4356,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "58357:7:0",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 4361,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4358,
                                  "name": "users",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4305,
                                  "src": "58372:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                    "typeString": "address[] calldata"
                                  }
                                },
                                "id": 4360,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4359,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4346,
                                  "src": "58378:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "58372:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "58357:23:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "id": 4367,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "!",
                                "prefix": true,
                                "src": "58398:38:0",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 4363,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4357,
                                      "src": "58410:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 4364,
                                      "name": "open",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4314,
                                      "src": "58416:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 4365,
                                      "name": "_exchangeRate",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4318,
                                      "src": "58422:13:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 4362,
                                    "name": "_isSolvent",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2624,
                                    "src": "58399:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_address_$_t_bool_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,bool,uint256) view returns (bool)"
                                    }
                                  },
                                  "id": 4366,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "58399:37:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 4494,
                              "nodeType": "IfStatement",
                              "src": "58394:1362:0",
                              "trueBody": {
                                "id": 4493,
                                "nodeType": "Block",
                                "src": "58438:1318:0",
                                "statements": [
                                  {
                                    "assignments": [
                                      4369
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 4369,
                                        "mutability": "mutable",
                                        "name": "borrowPart",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 4493,
                                        "src": "58456:18:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 4368,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "58456:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 4370,
                                    "initialValue": null,
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "58456:18:0"
                                  },
                                  {
                                    "id": 4399,
                                    "nodeType": "Block",
                                    "src": "58492:287:0",
                                    "statements": [
                                      {
                                        "assignments": [
                                          4372
                                        ],
                                        "declarations": [
                                          {
                                            "constant": false,
                                            "id": 4372,
                                            "mutability": "mutable",
                                            "name": "availableBorrowPart",
                                            "nodeType": "VariableDeclaration",
                                            "overrides": null,
                                            "scope": 4399,
                                            "src": "58514:27:0",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            },
                                            "typeName": {
                                              "id": 4371,
                                              "name": "uint256",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "58514:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "value": null,
                                            "visibility": "internal"
                                          }
                                        ],
                                        "id": 4376,
                                        "initialValue": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 4373,
                                            "name": "userBorrowPart",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2013,
                                            "src": "58544:14:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                              "typeString": "mapping(address => uint256)"
                                            }
                                          },
                                          "id": 4375,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 4374,
                                            "name": "user",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4357,
                                            "src": "58559:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "58544:20:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "VariableDeclarationStatement",
                                        "src": "58514:50:0"
                                      },
                                      {
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 4388,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftHandSide": {
                                            "argumentTypes": null,
                                            "id": 4377,
                                            "name": "borrowPart",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4369,
                                            "src": "58586:10:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "Assignment",
                                          "operator": "=",
                                          "rightHandSide": {
                                            "argumentTypes": null,
                                            "condition": {
                                              "argumentTypes": null,
                                              "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              "id": 4382,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "leftExpression": {
                                                "argumentTypes": null,
                                                "baseExpression": {
                                                  "argumentTypes": null,
                                                  "id": 4378,
                                                  "name": "maxBorrowParts",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 4308,
                                                  "src": "58599:14:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                                    "typeString": "uint256[] calldata"
                                                  }
                                                },
                                                "id": 4380,
                                                "indexExpression": {
                                                  "argumentTypes": null,
                                                  "id": 4379,
                                                  "name": "i",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 4346,
                                                  "src": "58614:1:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "IndexAccess",
                                                "src": "58599:17:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "nodeType": "BinaryOperation",
                                              "operator": ">",
                                              "rightExpression": {
                                                "argumentTypes": null,
                                                "id": 4381,
                                                "name": "availableBorrowPart",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 4372,
                                                "src": "58619:19:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "src": "58599:39:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              }
                                            },
                                            "falseExpression": {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 4384,
                                                "name": "maxBorrowParts",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 4308,
                                                "src": "58663:14:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                                  "typeString": "uint256[] calldata"
                                                }
                                              },
                                              "id": 4386,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 4385,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 4346,
                                                "src": "58678:1:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "58663:17:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 4387,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "nodeType": "Conditional",
                                            "src": "58599:81:0",
                                            "trueExpression": {
                                              "argumentTypes": null,
                                              "id": 4383,
                                              "name": "availableBorrowPart",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4372,
                                              "src": "58641:19:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "58586:94:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 4389,
                                        "nodeType": "ExpressionStatement",
                                        "src": "58586:94:0"
                                      },
                                      {
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 4397,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftHandSide": {
                                            "argumentTypes": null,
                                            "baseExpression": {
                                              "argumentTypes": null,
                                              "id": 4390,
                                              "name": "userBorrowPart",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2013,
                                              "src": "58702:14:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                                "typeString": "mapping(address => uint256)"
                                              }
                                            },
                                            "id": 4392,
                                            "indexExpression": {
                                              "argumentTypes": null,
                                              "id": 4391,
                                              "name": "user",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4357,
                                              "src": "58717:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            },
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": true,
                                            "nodeType": "IndexAccess",
                                            "src": "58702:20:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "Assignment",
                                          "operator": "=",
                                          "rightHandSide": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 4395,
                                                "name": "borrowPart",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 4369,
                                                "src": "58749:10:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 4393,
                                                "name": "availableBorrowPart",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 4372,
                                                "src": "58725:19:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "id": 4394,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "sub",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 47,
                                              "src": "58725:23: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": 4396,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "58725:35:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "58702:58:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 4398,
                                        "nodeType": "ExpressionStatement",
                                        "src": "58702:58:0"
                                      }
                                    ]
                                  },
                                  {
                                    "assignments": [
                                      4401
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 4401,
                                        "mutability": "mutable",
                                        "name": "borrowAmount",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 4493,
                                        "src": "58796:20:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 4400,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "58796:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 4407,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4404,
                                          "name": "borrowPart",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4369,
                                          "src": "58842:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "66616c7365",
                                          "id": 4405,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "bool",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "58854: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": 4402,
                                          "name": "_totalBorrow",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4335,
                                          "src": "58819:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                            "typeString": "struct Rebase memory"
                                          }
                                        },
                                        "id": 4403,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "toElastic",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 872,
                                        "src": "58819:22:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$753_memory_ptr_$",
                                          "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                        }
                                      },
                                      "id": 4406,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "58819:41:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "58796:64:0"
                                  },
                                  {
                                    "assignments": [
                                      4409
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 4409,
                                        "mutability": "mutable",
                                        "name": "collateralShare",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 4493,
                                        "src": "58878:23:0",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 4408,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "58878:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 4426,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 4423,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 4417,
                                                "name": "_exchangeRate",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 4318,
                                                "src": "59016:13:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "arguments": [
                                                  {
                                                    "argumentTypes": null,
                                                    "id": 4414,
                                                    "name": "LIQUIDATION_MULTIPLIER",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 2143,
                                                    "src": "58988:22:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  }
                                                ],
                                                "expression": {
                                                  "argumentTypes": [
                                                    {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": null,
                                                    "id": 4412,
                                                    "name": "borrowAmount",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4401,
                                                    "src": "58971:12:0",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "id": 4413,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "memberName": "mul",
                                                  "nodeType": "MemberAccess",
                                                  "referencedDeclaration": 75,
                                                  "src": "58971: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": 4415,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "58971:40:0",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "id": 4416,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "mul",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 75,
                                              "src": "58971:44: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": 4418,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "58971:59:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "/",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "components": [
                                              {
                                                "argumentTypes": null,
                                                "commonType": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                "id": 4421,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                  "argumentTypes": null,
                                                  "id": 4419,
                                                  "name": "LIQUIDATION_MULTIPLIER_PRECISION",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2146,
                                                  "src": "59062:32:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "*",
                                                "rightExpression": {
                                                  "argumentTypes": null,
                                                  "id": 4420,
                                                  "name": "EXCHANGE_RATE_PRECISION",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2140,
                                                  "src": "59097:23:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "src": "59062:58:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "id": 4422,
                                            "isConstant": false,
                                            "isInlineArray": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "TupleExpression",
                                            "src": "59061:60:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "58971:150:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "66616c7365",
                                          "id": 4424,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "bool",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "59147: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": 4410,
                                          "name": "bentoBoxTotals",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4339,
                                          "src": "58924:14:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                            "typeString": "struct Rebase memory"
                                          }
                                        },
                                        "id": 4411,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "toBase",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 816,
                                        "src": "58924:21:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_struct$_Rebase_$753_memory_ptr_$_t_uint256_$_t_bool_$returns$_t_uint256_$bound_to$_t_struct$_Rebase_$753_memory_ptr_$",
                                          "typeString": "function (struct Rebase memory,uint256,bool) pure returns (uint256)"
                                        }
                                      },
                                      "id": 4425,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "58924:250:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "58878:296:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4436,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 4427,
                                          "name": "userCollateralShare",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2009,
                                          "src": "59193:19:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                            "typeString": "mapping(address => uint256)"
                                          }
                                        },
                                        "id": 4429,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 4428,
                                          "name": "user",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4357,
                                          "src": "59213:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "59193:25:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 4434,
                                            "name": "collateralShare",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4409,
                                            "src": "59251:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "baseExpression": {
                                              "argumentTypes": null,
                                              "id": 4430,
                                              "name": "userCollateralShare",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 2009,
                                              "src": "59221:19:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                                "typeString": "mapping(address => uint256)"
                                              }
                                            },
                                            "id": 4432,
                                            "indexExpression": {
                                              "argumentTypes": null,
                                              "id": 4431,
                                              "name": "user",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4357,
                                              "src": "59241:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            },
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "nodeType": "IndexAccess",
                                            "src": "59221:25:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 4433,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "sub",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 47,
                                          "src": "59221:29: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": 4435,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "59221:46:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "59193:74:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 4437,
                                    "nodeType": "ExpressionStatement",
                                    "src": "59193:74:0"
                                  },
                                  {
                                    "eventCall": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4439,
                                          "name": "user",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4357,
                                          "src": "59310:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "condition": {
                                            "argumentTypes": null,
                                            "commonType": {
                                              "typeIdentifier": "t_contract$_ISwapper_$1880",
                                              "typeString": "contract ISwapper"
                                            },
                                            "id": 4444,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                              "argumentTypes": null,
                                              "id": 4440,
                                              "name": "swapper",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4312,
                                              "src": "59316:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_ISwapper_$1880",
                                                "typeString": "contract ISwapper"
                                              }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "==",
                                            "rightExpression": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "hexValue": "30",
                                                  "id": 4442,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "kind": "number",
                                                  "lValueRequested": false,
                                                  "nodeType": "Literal",
                                                  "src": "59336: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": 4441,
                                                "name": "ISwapper",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1880,
                                                "src": "59327:8:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_contract$_ISwapper_$1880_$",
                                                  "typeString": "type(contract ISwapper)"
                                                }
                                              },
                                              "id": 4443,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "59327:11:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_ISwapper_$1880",
                                                "typeString": "contract ISwapper"
                                              }
                                            },
                                            "src": "59316:22:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            }
                                          },
                                          "falseExpression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 4448,
                                                "name": "swapper",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 4312,
                                                "src": "59354:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_contract$_ISwapper_$1880",
                                                  "typeString": "contract ISwapper"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_contract$_ISwapper_$1880",
                                                  "typeString": "contract ISwapper"
                                                }
                                              ],
                                              "id": 4447,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "59346:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_address_$",
                                                "typeString": "type(address)"
                                              },
                                              "typeName": {
                                                "id": 4446,
                                                "name": "address",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "59346:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            "id": 4449,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "59346:16:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "id": 4450,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "Conditional",
                                          "src": "59316:46:0",
                                          "trueExpression": {
                                            "argumentTypes": null,
                                            "id": 4445,
                                            "name": "to",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4310,
                                            "src": "59341:2:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4451,
                                          "name": "collateralShare",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4409,
                                          "src": "59364:15:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 4438,
                                        "name": "LogRemoveCollateral",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1939,
                                        "src": "59290:19:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                          "typeString": "function (address,address,uint256)"
                                        }
                                      },
                                      "id": 4452,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "59290:90:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 4453,
                                    "nodeType": "EmitStatement",
                                    "src": "59285:95:0"
                                  },
                                  {
                                    "eventCall": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "condition": {
                                            "argumentTypes": null,
                                            "commonType": {
                                              "typeIdentifier": "t_contract$_ISwapper_$1880",
                                              "typeString": "contract ISwapper"
                                            },
                                            "id": 4459,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                              "argumentTypes": null,
                                              "id": 4455,
                                              "name": "swapper",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4312,
                                              "src": "59412:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_ISwapper_$1880",
                                                "typeString": "contract ISwapper"
                                              }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "==",
                                            "rightExpression": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "hexValue": "30",
                                                  "id": 4457,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "kind": "number",
                                                  "lValueRequested": false,
                                                  "nodeType": "Literal",
                                                  "src": "59432: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": 4456,
                                                "name": "ISwapper",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1880,
                                                "src": "59423:8:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_contract$_ISwapper_$1880_$",
                                                  "typeString": "type(contract ISwapper)"
                                                }
                                              },
                                              "id": 4458,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "59423:11:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_ISwapper_$1880",
                                                "typeString": "contract ISwapper"
                                              }
                                            },
                                            "src": "59412:22:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            }
                                          },
                                          "falseExpression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 4464,
                                                "name": "swapper",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 4312,
                                                "src": "59458:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_contract$_ISwapper_$1880",
                                                  "typeString": "contract ISwapper"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_contract$_ISwapper_$1880",
                                                  "typeString": "contract ISwapper"
                                                }
                                              ],
                                              "id": 4463,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "lValueRequested": false,
                                              "nodeType": "ElementaryTypeNameExpression",
                                              "src": "59450:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_address_$",
                                                "typeString": "type(address)"
                                              },
                                              "typeName": {
                                                "id": 4462,
                                                "name": "address",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "59450:7:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": null,
                                                  "typeString": null
                                                }
                                              }
                                            },
                                            "id": 4465,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "59450:16:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "id": 4466,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "Conditional",
                                          "src": "59412:54:0",
                                          "trueExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 4460,
                                              "name": "msg",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -15,
                                              "src": "59437:3:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_magic_message",
                                                "typeString": "msg"
                                              }
                                            },
                                            "id": 4461,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "sender",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": null,
                                            "src": "59437:10:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            }
                                          },
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4467,
                                          "name": "user",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4357,
                                          "src": "59468:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4468,
                                          "name": "borrowAmount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4401,
                                          "src": "59474:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4469,
                                          "name": "borrowPart",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4369,
                                          "src": "59488:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 4454,
                                        "name": "LogRepay",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1971,
                                        "src": "59403:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                                          "typeString": "function (address,address,uint256,uint256)"
                                        }
                                      },
                                      "id": 4470,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "59403:96:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 4471,
                                    "nodeType": "EmitStatement",
                                    "src": "59398:101:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4477,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 4472,
                                        "name": "allCollateralShare",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4326,
                                        "src": "59549:18:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 4475,
                                            "name": "collateralShare",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4409,
                                            "src": "59593:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 4473,
                                            "name": "allCollateralShare",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4326,
                                            "src": "59570:18:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 4474,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25,
                                          "src": "59570:22: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": 4476,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "59570:39:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "59549:60:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 4478,
                                    "nodeType": "ExpressionStatement",
                                    "src": "59549:60:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4484,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 4479,
                                        "name": "allBorrowAmount",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4329,
                                        "src": "59627:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 4482,
                                            "name": "borrowAmount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4401,
                                            "src": "59665:12:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 4480,
                                            "name": "allBorrowAmount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4329,
                                            "src": "59645:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 4481,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25,
                                          "src": "59645:19: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": 4483,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "59645:33:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "59627:51:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 4485,
                                    "nodeType": "ExpressionStatement",
                                    "src": "59627:51:0"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4491,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 4486,
                                        "name": "allBorrowPart",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4332,
                                        "src": "59696:13:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 4489,
                                            "name": "borrowPart",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4369,
                                            "src": "59730:10:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 4487,
                                            "name": "allBorrowPart",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4332,
                                            "src": "59712:13:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 4488,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25,
                                          "src": "59712: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": 4490,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "59712:29:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "59696:45:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 4492,
                                    "nodeType": "ExpressionStatement",
                                    "src": "59696:45:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 4352,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 4349,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4346,
                            "src": "58320:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 4350,
                              "name": "users",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4305,
                              "src": "58324:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                "typeString": "address[] calldata"
                              }
                            },
                            "id": 4351,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "58324:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "58320:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 4496,
                        "initializationExpression": {
                          "assignments": [
                            4346
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 4346,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 4496,
                              "src": "58305:9:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 4345,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "58305:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 4348,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 4347,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "58317:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "58305:13:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 4354,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "58338:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 4353,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4346,
                              "src": "58338:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 4355,
                          "nodeType": "ExpressionStatement",
                          "src": "58338:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "58300:1466:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4500,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4498,
                                "name": "allBorrowAmount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4329,
                                "src": "59783:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 4499,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "59802:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "59783:20:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b61736869506169723a20616c6c2061726520736f6c76656e74",
                              "id": 4501,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "59805:28:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_48e8242f765a7137d6941aab3446121e09341d1e921a8cf9e3dd3042136c28f4",
                                "typeString": "literal_string \"KashiPair: all are solvent\""
                              },
                              "value": "KashiPair: all are solvent"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_48e8242f765a7137d6941aab3446121e09341d1e921a8cf9e3dd3042136c28f4",
                                "typeString": "literal_string \"KashiPair: all are solvent\""
                              }
                            ],
                            "id": 4497,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "59775:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4502,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "59775:59:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4503,
                        "nodeType": "ExpressionStatement",
                        "src": "59775:59:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4514,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 4504,
                              "name": "_totalBorrow",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4335,
                              "src": "59844:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 4506,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "elastic",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 750,
                            "src": "59844:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4510,
                                    "name": "allBorrowAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4329,
                                    "src": "59892:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 4511,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "59892:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 4512,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "59892:23:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 4507,
                                  "name": "_totalBorrow",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4335,
                                  "src": "59867:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 4508,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "elastic",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 750,
                                "src": "59867:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 4509,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "59867:24: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": 4513,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "59867:49:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "59844:72:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 4515,
                        "nodeType": "ExpressionStatement",
                        "src": "59844:72:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4526,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 4516,
                              "name": "_totalBorrow",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4335,
                              "src": "59926:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                "typeString": "struct Rebase memory"
                              }
                            },
                            "id": 4518,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "base",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 752,
                            "src": "59926:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4522,
                                    "name": "allBorrowPart",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4332,
                                    "src": "59968:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 4523,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "to128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 101,
                                  "src": "59968:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 4524,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "59968:21:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 4519,
                                  "name": "_totalBorrow",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4335,
                                  "src": "59946:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                                    "typeString": "struct Rebase memory"
                                  }
                                },
                                "id": 4520,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "base",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 752,
                                "src": "59946:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 4521,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 199,
                              "src": "59946:21: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": 4525,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "59946:44:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "59926:64:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 4527,
                        "nodeType": "ExpressionStatement",
                        "src": "59926:64:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4530,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 4528,
                            "name": "totalBorrow",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2005,
                            "src": "60000:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_storage",
                              "typeString": "struct Rebase storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 4529,
                            "name": "_totalBorrow",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4335,
                            "src": "60014:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Rebase_$753_memory_ptr",
                              "typeString": "struct Rebase memory"
                            }
                          },
                          "src": "60000:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                            "typeString": "struct Rebase storage ref"
                          }
                        },
                        "id": 4531,
                        "nodeType": "ExpressionStatement",
                        "src": "60000:26:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4537,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 4532,
                            "name": "totalCollateralShare",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2001,
                            "src": "60036:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 4535,
                                "name": "allCollateralShare",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4326,
                                "src": "60084:18:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 4533,
                                "name": "totalCollateralShare",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2001,
                                "src": "60059:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 4534,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 47,
                              "src": "60059: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": 4536,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "60059:44:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "60036:67:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4538,
                        "nodeType": "ExpressionStatement",
                        "src": "60036:67:0"
                      },
                      {
                        "assignments": [
                          4540
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4540,
                            "mutability": "mutable",
                            "name": "allBorrowShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4733,
                            "src": "60114:22:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 4539,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "60114:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4547,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4543,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1995,
                              "src": "60156:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4544,
                              "name": "allBorrowAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4329,
                              "src": "60163:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 4545,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "60180:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$1118",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 4541,
                              "name": "bentoBox",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1983,
                              "src": "60139:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                "typeString": "contract IBentoBoxV1"
                              }
                            },
                            "id": 4542,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "toShare",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1724,
                            "src": "60139:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_uint256_$_t_bool_$returns$_t_uint256_$",
                              "typeString": "function (contract IERC20,uint256,bool) view external returns (uint256)"
                            }
                          },
                          "id": 4546,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "60139:46:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "60114:71:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 4549,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "60200:5:0",
                          "subExpression": {
                            "argumentTypes": null,
                            "id": 4548,
                            "name": "open",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4314,
                            "src": "60201:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 4731,
                          "nodeType": "Block",
                          "src": "61274:606:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 4669,
                                    "name": "collateral",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1993,
                                    "src": "61459:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4672,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "61479:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      ],
                                      "id": 4671,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "61471:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 4670,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "61471:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4673,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "61471:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_contract$_ISwapper_$1880",
                                        "typeString": "contract ISwapper"
                                      },
                                      "id": 4678,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 4674,
                                        "name": "swapper",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4312,
                                        "src": "61486:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                                          "typeString": "contract ISwapper"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "hexValue": "30",
                                            "id": 4676,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "61506: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": 4675,
                                          "name": "ISwapper",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1880,
                                          "src": "61497:8:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_contract$_ISwapper_$1880_$",
                                            "typeString": "type(contract ISwapper)"
                                          }
                                        },
                                        "id": 4677,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "61497:11:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                                          "typeString": "contract ISwapper"
                                        }
                                      },
                                      "src": "61486:22:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4682,
                                          "name": "swapper",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4312,
                                          "src": "61524:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_ISwapper_$1880",
                                            "typeString": "contract ISwapper"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_ISwapper_$1880",
                                            "typeString": "contract ISwapper"
                                          }
                                        ],
                                        "id": 4681,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "61516:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 4680,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "61516:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 4683,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "61516:16:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "id": 4684,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "Conditional",
                                    "src": "61486:46:0",
                                    "trueExpression": {
                                      "argumentTypes": null,
                                      "id": 4679,
                                      "name": "to",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4310,
                                      "src": "61511:2:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 4685,
                                    "name": "allCollateralShare",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4326,
                                    "src": "61534:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4666,
                                    "name": "bentoBox",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1983,
                                    "src": "61441:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  },
                                  "id": 4668,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "transfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1742,
                                  "src": "61441:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,address,address,uint256) external"
                                  }
                                },
                                "id": 4686,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "61441:112:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4687,
                              "nodeType": "ExpressionStatement",
                              "src": "61441:112:0"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_contract$_ISwapper_$1880",
                                  "typeString": "contract ISwapper"
                                },
                                "id": 4692,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 4688,
                                  "name": "swapper",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4312,
                                  "src": "61571:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ISwapper_$1880",
                                    "typeString": "contract ISwapper"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 4690,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "61591: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": 4689,
                                    "name": "ISwapper",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1880,
                                    "src": "61582:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_ISwapper_$1880_$",
                                      "typeString": "type(contract ISwapper)"
                                    }
                                  },
                                  "id": 4691,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "61582:11:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ISwapper_$1880",
                                    "typeString": "contract ISwapper"
                                  }
                                },
                                "src": "61571:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 4705,
                              "nodeType": "IfStatement",
                              "src": "61567:140:0",
                              "trueBody": {
                                "id": 4704,
                                "nodeType": "Block",
                                "src": "61595:112:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4696,
                                          "name": "collateral",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1993,
                                          "src": "61626:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$1118",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4697,
                                          "name": "asset",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1995,
                                          "src": "61638:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$1118",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 4698,
                                            "name": "msg",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": -15,
                                            "src": "61645:3:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_magic_message",
                                              "typeString": "msg"
                                            }
                                          },
                                          "id": 4699,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "sender",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": null,
                                          "src": "61645:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address_payable",
                                            "typeString": "address payable"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4700,
                                          "name": "allBorrowShare",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4540,
                                          "src": "61657:14:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4701,
                                          "name": "allCollateralShare",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4326,
                                          "src": "61673:18:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$1118",
                                            "typeString": "contract IERC20"
                                          },
                                          {
                                            "typeIdentifier": "t_contract$_IERC20_$1118",
                                            "typeString": "contract IERC20"
                                          },
                                          {
                                            "typeIdentifier": "t_address_payable",
                                            "typeString": "address payable"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 4693,
                                          "name": "swapper",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4312,
                                          "src": "61613:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_ISwapper_$1880",
                                            "typeString": "contract ISwapper"
                                          }
                                        },
                                        "id": 4695,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "swap",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1859,
                                        "src": "61613:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_contract$_IERC20_$1118_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                          "typeString": "function (contract IERC20,contract IERC20,address,uint256,uint256) external returns (uint256,uint256)"
                                        }
                                      },
                                      "id": 4702,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "61613:79:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                        "typeString": "tuple(uint256,uint256)"
                                      }
                                    },
                                    "id": 4703,
                                    "nodeType": "ExpressionStatement",
                                    "src": "61613:79:0"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 4709,
                                    "name": "asset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1995,
                                    "src": "61739:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4710,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "61746:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 4711,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "61746:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4714,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "61766:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      ],
                                      "id": 4713,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "61758:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 4712,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "61758:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4715,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "61758:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 4716,
                                    "name": "allBorrowShare",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4540,
                                    "src": "61773:14:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4706,
                                    "name": "bentoBox",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1983,
                                    "src": "61721:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  },
                                  "id": 4708,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "transfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1742,
                                  "src": "61721:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,address,address,uint256) external"
                                  }
                                },
                                "id": 4717,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "61721:67:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4718,
                              "nodeType": "ExpressionStatement",
                              "src": "61721:67:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 4729,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4719,
                                    "name": "totalAsset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2003,
                                    "src": "61802:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                      "typeString": "struct Rebase storage ref"
                                    }
                                  },
                                  "id": 4721,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 750,
                                  "src": "61802:18:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 4725,
                                          "name": "allBorrowShare",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4540,
                                          "src": "61846:14:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 4726,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "to128",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 101,
                                        "src": "61846:20:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256) pure returns (uint128)"
                                        }
                                      },
                                      "id": 4727,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "61846:22:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 4722,
                                        "name": "totalAsset",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2003,
                                        "src": "61823:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                          "typeString": "struct Rebase storage ref"
                                        }
                                      },
                                      "id": 4723,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "elastic",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 750,
                                      "src": "61823:18:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "id": 4724,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 177,
                                    "src": "61823:22: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": 4728,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "61823:46:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "src": "61802:67:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 4730,
                              "nodeType": "ExpressionStatement",
                              "src": "61802:67:0"
                            }
                          ]
                        },
                        "id": 4732,
                        "nodeType": "IfStatement",
                        "src": "60196:1684:0",
                        "trueBody": {
                          "id": 4665,
                          "nodeType": "Block",
                          "src": "60207:1061:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4553,
                                        "name": "swapper",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4312,
                                        "src": "60343:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                                          "typeString": "contract ISwapper"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                                          "typeString": "contract ISwapper"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 4551,
                                        "name": "masterContract",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1985,
                                        "src": "60319:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      },
                                      "id": 4552,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "swappers",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1991,
                                      "src": "60319:23:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_external_view$_t_contract$_ISwapper_$1880_$returns$_t_bool_$",
                                        "typeString": "function (contract ISwapper) view external returns (bool)"
                                      }
                                    },
                                    "id": 4554,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "60319:32:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4b61736869506169723a20496e76616c69642073776170706572",
                                    "id": 4555,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "60353:28:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_ed62baa2d3adb9c9222dc0e8b4810e3847fd6e6ef7645ac919f4ee3082299d04",
                                      "typeString": "literal_string \"KashiPair: Invalid swapper\""
                                    },
                                    "value": "KashiPair: Invalid swapper"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_ed62baa2d3adb9c9222dc0e8b4810e3847fd6e6ef7645ac919f4ee3082299d04",
                                      "typeString": "literal_string \"KashiPair: Invalid swapper\""
                                    }
                                  ],
                                  "id": 4550,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "60311:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 4556,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "60311:71:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4557,
                              "nodeType": "ExpressionStatement",
                              "src": "60311:71:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 4561,
                                    "name": "collateral",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1993,
                                    "src": "60481:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4564,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "60501:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      ],
                                      "id": 4563,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "60493:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 4562,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "60493:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4565,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "60493:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4568,
                                        "name": "swapper",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4312,
                                        "src": "60516:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                                          "typeString": "contract ISwapper"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                                          "typeString": "contract ISwapper"
                                        }
                                      ],
                                      "id": 4567,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "60508:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 4566,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "60508:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4569,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "60508:16:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 4570,
                                    "name": "allCollateralShare",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4326,
                                    "src": "60526:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4558,
                                    "name": "bentoBox",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1983,
                                    "src": "60463:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  },
                                  "id": 4560,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "transfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1742,
                                  "src": "60463:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,address,address,uint256) external"
                                  }
                                },
                                "id": 4571,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "60463:82:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4572,
                              "nodeType": "ExpressionStatement",
                              "src": "60463:82:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 4576,
                                    "name": "collateral",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1993,
                                    "src": "60572:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 4577,
                                    "name": "asset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1995,
                                    "src": "60584:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4580,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "60599:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      ],
                                      "id": 4579,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "60591:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 4578,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "60591:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4581,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "60591:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 4582,
                                    "name": "allBorrowShare",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4540,
                                    "src": "60606:14:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 4583,
                                    "name": "allCollateralShare",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4326,
                                    "src": "60622:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4573,
                                    "name": "swapper",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4312,
                                    "src": "60559:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ISwapper_$1880",
                                      "typeString": "contract ISwapper"
                                    }
                                  },
                                  "id": 4575,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "swap",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1859,
                                  "src": "60559:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_contract$_IERC20_$1118_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                    "typeString": "function (contract IERC20,contract IERC20,address,uint256,uint256) external returns (uint256,uint256)"
                                  }
                                },
                                "id": 4584,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "60559:82:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                                  "typeString": "tuple(uint256,uint256)"
                                }
                              },
                              "id": 4585,
                              "nodeType": "ExpressionStatement",
                              "src": "60559:82:0"
                            },
                            {
                              "assignments": [
                                4587
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 4587,
                                  "mutability": "mutable",
                                  "name": "returnedShare",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 4665,
                                  "src": "60656:21:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 4586,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "60656:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 4603,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 4599,
                                          "name": "totalAsset",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2003,
                                          "src": "60733:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                            "typeString": "struct Rebase storage ref"
                                          }
                                        },
                                        "id": 4600,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "elastic",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 750,
                                        "src": "60733:18:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "id": 4598,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "60725:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_uint256_$",
                                        "typeString": "type(uint256)"
                                      },
                                      "typeName": {
                                        "id": 4597,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "60725:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4601,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "60725:27:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4590,
                                        "name": "asset",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1995,
                                        "src": "60699:5:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IERC20_$1118",
                                          "typeString": "contract IERC20"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 4593,
                                            "name": "this",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": -28,
                                            "src": "60714:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                              "typeString": "contract KashiPairMediumRiskV1"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                              "typeString": "contract KashiPairMediumRiskV1"
                                            }
                                          ],
                                          "id": 4592,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "60706:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_address_$",
                                            "typeString": "type(address)"
                                          },
                                          "typeName": {
                                            "id": 4591,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "60706:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 4594,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "60706:13:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_IERC20_$1118",
                                          "typeString": "contract IERC20"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 4588,
                                        "name": "bentoBox",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1983,
                                        "src": "60680:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                          "typeString": "contract IBentoBoxV1"
                                        }
                                      },
                                      "id": 4589,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "balanceOf",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1512,
                                      "src": "60680:18:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_external_view$_t_contract$_IERC20_$1118_$_t_address_$returns$_t_uint256_$",
                                        "typeString": "function (contract IERC20,address) view external returns (uint256)"
                                      }
                                    },
                                    "id": 4595,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "60680:40:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 4596,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 47,
                                  "src": "60680:44: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": 4602,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "60680:73:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "60656:97:0"
                            },
                            {
                              "assignments": [
                                4605
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 4605,
                                  "mutability": "mutable",
                                  "name": "extraShare",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 4665,
                                  "src": "60767:18:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 4604,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "60767:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 4610,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 4608,
                                    "name": "allBorrowShare",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4540,
                                    "src": "60806:14:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4606,
                                    "name": "returnedShare",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4587,
                                    "src": "60788:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 4607,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 47,
                                  "src": "60788: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": 4609,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "60788:33:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "60767:54:0"
                            },
                            {
                              "assignments": [
                                4612
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 4612,
                                  "mutability": "mutable",
                                  "name": "feeShare",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 4665,
                                  "src": "60835:16:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 4611,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "60835:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 4619,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 4618,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 4615,
                                      "name": "PROTOCOL_FEE",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2149,
                                      "src": "60869:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4613,
                                      "name": "extraShare",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4605,
                                      "src": "60854:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 4614,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 75,
                                    "src": "60854:14: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": 4616,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "60854:28:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "/",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 4617,
                                  "name": "PROTOCOL_FEE_DIVISOR",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2152,
                                  "src": "60885:20:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "60854:51:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "60835:70:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 4623,
                                    "name": "asset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1995,
                                    "src": "61016:5:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4626,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "61031:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      ],
                                      "id": 4625,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "61023:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 4624,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "61023:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4627,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "61023:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 4628,
                                        "name": "masterContract",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1985,
                                        "src": "61038:14:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      },
                                      "id": 4629,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "feeTo",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1987,
                                      "src": "61038:20:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                        "typeString": "function () view external returns (address)"
                                      }
                                    },
                                    "id": 4630,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "61038:22:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 4631,
                                    "name": "feeShare",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4612,
                                    "src": "61062:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20_$1118",
                                      "typeString": "contract IERC20"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4620,
                                    "name": "bentoBox",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1983,
                                    "src": "60998:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IBentoBoxV1_$1796",
                                      "typeString": "contract IBentoBoxV1"
                                    }
                                  },
                                  "id": 4622,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "transfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1742,
                                  "src": "60998:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$1118_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC20,address,address,uint256) external"
                                  }
                                },
                                "id": 4632,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "60998:73:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4633,
                              "nodeType": "ExpressionStatement",
                              "src": "60998:73:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 4647,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4634,
                                    "name": "totalAsset",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2003,
                                    "src": "61085:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                      "typeString": "struct Rebase storage ref"
                                    }
                                  },
                                  "id": 4636,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "elastic",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 750,
                                  "src": "61085:18:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 4642,
                                              "name": "feeShare",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4612,
                                              "src": "61147:8:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 4640,
                                              "name": "returnedShare",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4587,
                                              "src": "61129:13:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 4641,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "sub",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 47,
                                            "src": "61129: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": 4643,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "61129:27:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 4644,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "to128",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 101,
                                        "src": "61129:33:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256) pure returns (uint128)"
                                        }
                                      },
                                      "id": 4645,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "61129:35:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 4637,
                                        "name": "totalAsset",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2003,
                                        "src": "61106:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Rebase_$753_storage",
                                          "typeString": "struct Rebase storage ref"
                                        }
                                      },
                                      "id": 4638,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "elastic",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 750,
                                      "src": "61106:18:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint128",
                                        "typeString": "uint128"
                                      }
                                    },
                                    "id": 4639,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 177,
                                    "src": "61106:22: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": 4646,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "61106:59:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                },
                                "src": "61085:80:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 4648,
                              "nodeType": "ExpressionStatement",
                              "src": "61085:80:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4652,
                                        "name": "swapper",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4312,
                                        "src": "61204:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                                          "typeString": "contract ISwapper"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                                          "typeString": "contract ISwapper"
                                        }
                                      ],
                                      "id": 4651,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "61196:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 4650,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "61196:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4653,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "61196:16:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4656,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "61222:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                          "typeString": "contract KashiPairMediumRiskV1"
                                        }
                                      ],
                                      "id": 4655,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "61214:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 4654,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "61214:7:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 4657,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "61214:13:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 4660,
                                        "name": "feeShare",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4612,
                                        "src": "61244:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 4658,
                                        "name": "extraShare",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4605,
                                        "src": "61229:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 4659,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 47,
                                      "src": "61229:14: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": 4661,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "61229:24:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 4662,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "61255:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 4649,
                                  "name": "LogAddAsset",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1931,
                                  "src": "61184:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256,uint256)"
                                  }
                                },
                                "id": 4663,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "61184:73:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4664,
                              "nodeType": "EmitStatement",
                              "src": "61179:78:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4302,
                    "nodeType": "StructuredDocumentation",
                    "src": "57159:590:0",
                    "text": "@notice Handles the liquidation of users' balances, once the users' amount of collateral is too low.\n @param users An array of user addresses.\n @param maxBorrowParts A one-to-one mapping to `users`, contains maximum (partial) borrow amounts (to liquidate) of the respective user.\n @param to Address of the receiver in open liquidations if `swapper` is zero.\n @param swapper Contract address of the `ISwapper` implementation. Swappers are restricted for closed liquidations. See `setSwapper`.\n @param open True to perform a open liquidation else False."
                  },
                  "functionSelector": "76ee101b",
                  "id": 4734,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "liquidate",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4315,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4305,
                        "mutability": "mutable",
                        "name": "users",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4734,
                        "src": "57782:24:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 4303,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "57782:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 4304,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "57782:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4308,
                        "mutability": "mutable",
                        "name": "maxBorrowParts",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4734,
                        "src": "57816:33:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 4306,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "57816:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 4307,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "57816:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4310,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4734,
                        "src": "57859:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4309,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "57859:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4312,
                        "mutability": "mutable",
                        "name": "swapper",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4734,
                        "src": "57879:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                          "typeString": "contract ISwapper"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4311,
                          "name": "ISwapper",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1880,
                          "src": "57879:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ISwapper_$1880",
                            "typeString": "contract ISwapper"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4314,
                        "mutability": "mutable",
                        "name": "open",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4734,
                        "src": "57905:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4313,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "57905:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "57772:148:0"
                  },
                  "returnParameters": {
                    "id": 4316,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "57928:0:0"
                  },
                  "scope": 4810,
                  "src": "57754:4132:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4774,
                    "nodeType": "Block",
                    "src": "61971:318:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 4738,
                            "name": "accrue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2553,
                            "src": "61981:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 4739,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "61981:8:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4740,
                        "nodeType": "ExpressionStatement",
                        "src": "61981:8:0"
                      },
                      {
                        "assignments": [
                          4742
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4742,
                            "mutability": "mutable",
                            "name": "_feeTo",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4774,
                            "src": "61999:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 4741,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "61999:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4746,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 4743,
                              "name": "masterContract",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1985,
                              "src": "62016:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_KashiPairMediumRiskV1_$4810",
                                "typeString": "contract KashiPairMediumRiskV1"
                              }
                            },
                            "id": 4744,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "feeTo",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1987,
                            "src": "62016:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                              "typeString": "function () view external returns (address)"
                            }
                          },
                          "id": 4745,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "62016:22:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "61999:39:0"
                      },
                      {
                        "assignments": [
                          4748
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4748,
                            "mutability": "mutable",
                            "name": "_feesEarnedFraction",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4774,
                            "src": "62048:27:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 4747,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "62048:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4751,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 4749,
                            "name": "accrueInfo",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2025,
                            "src": "62078:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                              "typeString": "struct KashiPairMediumRiskV1.AccrueInfo storage ref"
                            }
                          },
                          "id": 4750,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "feesEarnedFraction",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 2022,
                          "src": "62078:29:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "62048:59:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4761,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 4752,
                              "name": "balanceOf",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 423,
                              "src": "62117:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 4754,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4753,
                              "name": "_feeTo",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4742,
                              "src": "62127:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "62117:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 4759,
                                "name": "_feesEarnedFraction",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4748,
                                "src": "62159:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 4755,
                                  "name": "balanceOf",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 423,
                                  "src": "62137:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 4757,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4756,
                                  "name": "_feeTo",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4742,
                                  "src": "62147:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "62137:17:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 4758,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25,
                              "src": "62137:21: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": 4760,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "62137:42:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "62117:62:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4762,
                        "nodeType": "ExpressionStatement",
                        "src": "62117:62:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4767,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 4763,
                              "name": "accrueInfo",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2025,
                              "src": "62189:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_AccrueInfo_$2023_storage",
                                "typeString": "struct KashiPairMediumRiskV1.AccrueInfo storage ref"
                              }
                            },
                            "id": 4765,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "feesEarnedFraction",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2022,
                            "src": "62189:29:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 4766,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "62221:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "62189:33:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 4768,
                        "nodeType": "ExpressionStatement",
                        "src": "62189:33:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4770,
                              "name": "_feeTo",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4742,
                              "src": "62254:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4771,
                              "name": "_feesEarnedFraction",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4748,
                              "src": "62262:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 4769,
                            "name": "LogWithdrawFees",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1981,
                            "src": "62238:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 4772,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "62238:44:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4773,
                        "nodeType": "EmitStatement",
                        "src": "62233:49:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4735,
                    "nodeType": "StructuredDocumentation",
                    "src": "61892:43:0",
                    "text": "@notice Withdraws the fees accumulated."
                  },
                  "functionSelector": "476343ee",
                  "id": 4775,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdrawFees",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4736,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "61961:2:0"
                  },
                  "returnParameters": {
                    "id": 4737,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "61971:0:0"
                  },
                  "scope": 4810,
                  "src": "61940:349:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4791,
                    "nodeType": "Block",
                    "src": "62669:43:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4789,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 4785,
                              "name": "swappers",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1991,
                              "src": "62679:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_ISwapper_$1880_$_t_bool_$",
                                "typeString": "mapping(contract ISwapper => bool)"
                              }
                            },
                            "id": 4787,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4786,
                              "name": "swapper",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4778,
                              "src": "62688:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ISwapper_$1880",
                                "typeString": "contract ISwapper"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "62679:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 4788,
                            "name": "enable",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4780,
                            "src": "62699:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "62679:26:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 4790,
                        "nodeType": "ExpressionStatement",
                        "src": "62679:26:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4776,
                    "nodeType": "StructuredDocumentation",
                    "src": "62295:301:0",
                    "text": "@notice Used to register and enable or disable swapper contracts used in closed liquidations.\n MasterContract Only Admin function.\n @param swapper The address of the swapper contract that conforms to `ISwapper`.\n @param enable True to enable the swapper. To disable use False."
                  },
                  "functionSelector": "3f2617cb",
                  "id": 4792,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 4783,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 4782,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 327,
                        "src": "62659:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "62659:9:0"
                    }
                  ],
                  "name": "setSwapper",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4781,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4778,
                        "mutability": "mutable",
                        "name": "swapper",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4792,
                        "src": "62621:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ISwapper_$1880",
                          "typeString": "contract ISwapper"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4777,
                          "name": "ISwapper",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1880,
                          "src": "62621:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ISwapper_$1880",
                            "typeString": "contract ISwapper"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4780,
                        "mutability": "mutable",
                        "name": "enable",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4792,
                        "src": "62639:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4779,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "62639:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "62620:31:0"
                  },
                  "returnParameters": {
                    "id": 4784,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "62669:0:0"
                  },
                  "scope": 4810,
                  "src": "62601:111:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4808,
                    "nodeType": "Block",
                    "src": "62938:66:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4802,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 4800,
                            "name": "feeTo",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1987,
                            "src": "62948:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 4801,
                            "name": "newFeeTo",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4795,
                            "src": "62956:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "62948:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 4803,
                        "nodeType": "ExpressionStatement",
                        "src": "62948:16:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4805,
                              "name": "newFeeTo",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4795,
                              "src": "62988:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 4804,
                            "name": "LogFeeTo",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1975,
                            "src": "62979:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 4806,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "62979:18:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4807,
                        "nodeType": "EmitStatement",
                        "src": "62974:23:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4793,
                    "nodeType": "StructuredDocumentation",
                    "src": "62718:162:0",
                    "text": "@notice Sets the beneficiary of fees accrued in liquidations.\n MasterContract Only Admin function.\n @param newFeeTo The address of the receiver."
                  },
                  "functionSelector": "f46901ed",
                  "id": 4809,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 4798,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 4797,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 327,
                        "src": "62928:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "62928:9:0"
                    }
                  ],
                  "name": "setFeeTo",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4796,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4795,
                        "mutability": "mutable",
                        "name": "newFeeTo",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4809,
                        "src": "62903:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4794,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "62903:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "62902:18:0"
                  },
                  "returnParameters": {
                    "id": 4799,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "62938:0:0"
                  },
                  "scope": 4810,
                  "src": "62885:119:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 4811,
              "src": "29834:33172:0"
            }
          ],
          "src": "718:62289:0"
        },
        "id": 0
      }
    }
  }
}
