ETH Price: $2,681.25 (-3.38%)

Contract

0x434d68Ffc1C4DaE115E2176EdDf6539A5b8ce7D9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Repay131245422021-08-30 3:51:391265 days ago1630295499IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0672753390.50850699
Deposit131175962021-08-29 2:06:151266 days ago1630202775IN
0x434d68Ff...A5b8ce7D9
0 ETH0.084996796.87084204
Harvest131174672021-08-29 1:37:181266 days ago1630201038IN
0x434d68Ff...A5b8ce7D9
0 ETH0.15556965147.88172772
Deposit131047982021-08-27 2:27:411268 days ago1630031261IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0573248565.33461812
Harvest131046872021-08-27 2:05:351268 days ago1630029935IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0772262376.80350429
Deposit130853862021-08-24 2:36:171271 days ago1629772577IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0459554352.37546144
Harvest130852392021-08-24 2:08:151271 days ago1629770895IN
0x434d68Ff...A5b8ce7D9
0 ETH0.10866131104.44738283
Deposit130524272021-08-19 0:28:491276 days ago1629332929IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0282719730.89468496
Harvest130522352021-08-18 23:45:311276 days ago1629330331IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0418960340.00889535
Harvest130475152021-08-18 6:03:361277 days ago1629266616IN
0x434d68Ff...A5b8ce7D9
0 ETH0.032632431.72802815
Deposit130473862021-08-18 5:34:141277 days ago1629264854IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0259006129.71337093
Set Admin130396812021-08-17 1:02:541278 days ago1629162174IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0016836456
Set Next Time Lo...130396742021-08-17 1:01:121278 days ago1629162072IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0022582548
Authorize130333802021-08-16 1:46:051279 days ago1629078365IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0016745365
Authorize130333532021-08-16 1:41:461279 days ago1629078106IN
0x434d68Ff...A5b8ce7D9
0 ETH0.0035278774

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrategyConvexUsdpDai

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-16
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-11
*/

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.6;

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface BaseRewardPool {
    function balanceOf(address _account) external view returns (uint);

    function getReward(address _account, bool _claimExtras) external returns (bool);

    function withdrawAndUnwrap(uint amount, bool claim) external returns (bool);
}

interface Booster {
    function poolInfo(uint _pid)
        external
        view
        returns (
            address lptoken,
            address token,
            address gauge,
            address crvRewards,
            address stash,
            bool shutdown
        );

    function deposit(
        uint _pid,
        uint _amount,
        bool _stake
    ) external returns (bool);

    function withdraw(uint _pid, uint _amount) external returns (bool);
}

interface DepositZapUsdp3Crv {
    function add_liquidity(uint[4] calldata _amounts, uint _min_mint_amount)
        external
        returns (uint);

    function remove_liquidity_one_coin(
        uint _burn_amount,
        int128 _i,
        uint _min_amount
    ) external returns (uint);

    function calc_withdraw_one_coin(
        address _pool,
        uint _amount,
        int128 _i
    ) external view returns (uint);
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint value);
}

interface IFundManager {
    function token() external view returns (address);

    function borrow(uint amount) external returns (uint);

    function repay(uint amount) external returns (uint);

    function report(uint gain, uint loss) external;

    function getDebt(address strategy) external view returns (uint);
}

library SafeERC20 {
    using SafeMath for uint;
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint value
    ) internal {
        uint newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, newAllowance)
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint value
    ) internal {
        uint newAllowance = token.allowance(address(this), spender).sub(
            value,
            "SafeERC20: decreased allowance below zero"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, newAllowance)
        );
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint a, uint b) internal pure returns (bool, uint) {
        uint c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint a, uint b) internal pure returns (bool, uint) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint a, uint b) internal pure returns (bool, uint) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint a, uint b) internal pure returns (bool, uint) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint a, uint b) internal pure returns (bool, uint) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint a, uint b) internal pure returns (uint) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint a, uint b) internal pure returns (uint) {
        if (a == 0) return 0;
        uint c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint a, uint b) internal pure returns (uint) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint a, uint b) internal pure returns (uint) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint a,
        uint b,
        string memory errorMessage
    ) internal pure returns (uint) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

interface StableSwapUsdp3Crv {
    function coins(uint _i) external view returns (address);

    function get_virtual_price() external view returns (uint);
}

abstract contract Strategy {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    event SetNextTimeLock(address nextTimeLock);
    event AcceptTimeLock(address timeLock);
    event SetAdmin(address admin);
    event Authorize(address addr, bool authorized);
    event SetTreasury(address treasury);
    event SetFundManager(address fundManager);

    event Deposit(uint amount, uint borrowed);
    event Repay(uint amount, uint repaid);
    event Withdraw(uint amount, uint withdrawn, uint loss);
    event ClaimRewards(uint profit);
    event Skim(uint total, uint debt, uint profit);
    event Report(uint gain, uint loss, uint free, uint total, uint debt);

    // Privilege - time lock >= admin >= authorized addresses
    address public timeLock;
    address public nextTimeLock;
    address public admin;
    address public treasury; // Profit is sent to this address

    // authorization other than time lock and admin
    mapping(address => bool) public authorized;

    IERC20 public immutable token;
    IFundManager public fundManager;

    // Performance fee sent to treasury
    uint public perfFee = 1000;
    uint private constant PERF_FEE_CAP = 2000; // Upper limit to performance fee
    uint internal constant PERF_FEE_MAX = 10000;

    bool public claimRewardsOnMigrate = true;

    constructor(
        address _token,
        address _fundManager,
        address _treasury
    ) {
        // Don't allow accidentally sending perf fee to 0 address
        require(_treasury != address(0), "treasury = 0 address");

        timeLock = msg.sender;
        admin = msg.sender;
        treasury = _treasury;

        require(
            IFundManager(_fundManager).token() == _token,
            "fund manager token != token"
        );

        fundManager = IFundManager(_fundManager);
        token = IERC20(_token);

        IERC20(_token).safeApprove(_fundManager, type(uint).max);
    }

    modifier onlyTimeLock() {
        require(msg.sender == timeLock, "!time lock");
        _;
    }

    modifier onlyTimeLockOrAdmin() {
        require(msg.sender == timeLock || msg.sender == admin, "!auth");
        _;
    }

    modifier onlyAuthorized() {
        require(
            msg.sender == timeLock || msg.sender == admin || authorized[msg.sender],
            "!auth"
        );
        _;
    }

    modifier onlyFundManager() {
        require(msg.sender == address(fundManager), "!fund manager");
        _;
    }

    /*
    @notice Set next time lock
    @param _nextTimeLock Address of next time lock
    @dev nextTimeLock can become timeLock by calling acceptTimeLock()
    */
    function setNextTimeLock(address _nextTimeLock) external onlyTimeLock {
        // Allow next time lock to be zero address (cancel next time lock)
        nextTimeLock = _nextTimeLock;
        emit SetNextTimeLock(_nextTimeLock);
    }

    /*
    @notice Set timeLock to msg.sender
    @dev msg.sender must be nextTimeLock
    */
    function acceptTimeLock() external {
        require(msg.sender == nextTimeLock, "!next time lock");
        timeLock = msg.sender;
        nextTimeLock = address(0);
        emit AcceptTimeLock(msg.sender);
    }

    /*
    @notice Set admin
    @param _admin Address of admin
    */
    function setAdmin(address _admin) external onlyTimeLockOrAdmin {
        require(_admin != address(0), "admin = 0 address");
        admin = _admin;
        emit SetAdmin(_admin);
    }

    /*
    @notice Set authorization
    @param _addr Address to authorize
    @param _authorized Boolean
    */
    function authorize(address _addr, bool _authorized) external onlyTimeLockOrAdmin {
        require(_addr != address(0), "addr = 0 address");
        authorized[_addr] = _authorized;
        emit Authorize(_addr, _authorized);
    }

    /*
    @notice Set treasury
    @param _treasury Address of treasury
    */
    function setTreasury(address _treasury) external onlyTimeLockOrAdmin {
        // Don't allow accidentally sending perf fee to 0 address
        require(_treasury != address(0), "treasury = 0 address");
        treasury = _treasury;
        emit SetTreasury(_treasury);
    }

    /*
    @notice Set performance fee
    @param _fee Performance fee
    */
    function setPerfFee(uint _fee) external onlyTimeLockOrAdmin {
        require(_fee <= PERF_FEE_CAP, "fee > cap");
        perfFee = _fee;
    }

    function setFundManager(address _fundManager) external onlyTimeLock {
        if (address(fundManager) != address(0)) {
            token.safeApprove(address(fundManager), 0);
        }

        require(
            IFundManager(_fundManager).token() == address(token),
            "new fund manager token != token"
        );

        fundManager = IFundManager(_fundManager);
        token.safeApprove(_fundManager, type(uint).max);

        emit SetFundManager(_fundManager);
    }

    /*
    @notice Set `claimRewardsOnMigrate`. If `false` skip call to `claimRewards`
            when `migrate` is called.
    @param _claimRewards Boolean to call or skip call to `claimRewards`
    */
    function setClaimRewardsOnMigrate(bool _claimRewards) external onlyTimeLockOrAdmin {
        claimRewardsOnMigrate = _claimRewards;
    }

    /*
    @notice Transfer funds from `_from` address. Used for migration.
    @param _from Address to transfer token from
    @param _amount Amount of token to transfer
    */
    function transferTokenFrom(address _from, uint _amount) external onlyAuthorized {
        token.safeTransferFrom(_from, address(this), _amount);
    }

    /*
    @notice Returns approximate amount of token locked in this contract
    @dev Output may vary depending on price pulled from external DeFi contracts
    */
    function totalAssets() external view virtual returns (uint);

    /*
    @notice Deposit into strategy
    @param _amount Amount of token to deposit from fund manager
    @param _min Minimum amount borrowed
    */
    function deposit(uint _amount, uint _min) external virtual;

    /*
    @notice Withdraw token from this contract
    @dev Only callable by fund manager
    @dev Returns current loss = debt to fund manager - total assets
    */
    function withdraw(uint _amount) external virtual returns (uint);

    /*
    @notice Repay fund manager
    @param _amount Amount of token to repay to fund manager
    @param _min Minimum amount repaid
    @dev Call report after this to report any loss
    */
    function repay(uint _amount, uint _min) external virtual;

    /*
    @notice Claim any reward tokens, sell for token
    @param _minProfit Minumum amount of token to gain from selling rewards
    */
    function claimRewards(uint _minProfit) external virtual;

    /*
    @notice Free up any profit over debt
    */
    function skim() external virtual;

    /*
    @notice Report gain or loss back to fund manager
    @param _minTotal Minimum value of total assets.
               Used to protect against price manipulation.
    @param _maxTotal Maximum value of total assets Used
               Used to protect against price manipulation.  
    */
    function report(uint _minTotal, uint _maxTotal) external virtual;

    /*
    @notice Claim rewards, skim and report
    @param _minProfit Minumum amount of token to gain from selling rewards
    @param _minTotal Minimum value of total assets.
               Used to protect against price manipulation.
    @param _maxTotal Maximum value of total assets Used
               Used to protect against price manipulation.  
    */
    function harvest(
        uint _minProfit,
        uint _minTotal,
        uint _maxTotal
    ) external virtual;

    /*
    @notice Migrate to new version of this strategy
    @param _strategy Address of new strategy
    @dev Only callable by fund manager
    */
    function migrate(address _strategy) external virtual;

    /*
    @notice Transfer token accidentally sent here back to admin
    @param _token Address of token to transfer
    */
    function sweep(address _token) external virtual;
}

contract StrategyConvexUsdp is Strategy {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    // Uniswap and Sushiswap //
    // UNISWAP = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    // SUSHISWAP = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F;
    address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    uint private constant NUM_REWARDS = 2;
    // address of DEX (uniswap or sushiswap) to use for selling reward tokens
    // CRV, CVX
    address[NUM_REWARDS] public dex;

    address private constant CRV = 0xD533a949740bb3306d119CC777fa900bA034cd52;
    address private constant CVX = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B;

    // Solc 0.7 cannot create constant arrays
    address[NUM_REWARDS] private REWARDS = [CRV, CVX];

    // Convex //
    Booster private constant BOOSTER =
        Booster(0xF403C135812408BFbE8713b5A23a04b3D48AAE31);
    // pool id
    uint private constant PID = 28;
    BaseRewardPool private constant REWARD =
        BaseRewardPool(0x24DfFd1949F888F91A0c8341Fc98a3F280a782a8);
    bool public shouldClaimExtras = true;

    // Curve //
    // Deposit USDP + 3CRV
    DepositZapUsdp3Crv private constant ZAP =
        DepositZapUsdp3Crv(0x3c8cAee4E09296800f8D29A68Fa3837e2dae4940);
    // StableSwap USDP + 3CRV (meta pool)
    StableSwapUsdp3Crv private constant CURVE_POOL =
        StableSwapUsdp3Crv(0x42d7025938bEc20B69cBae5A77421082407f053A);
    // LP token for curve pool (USDP / 3CRV)
    IERC20 private constant CURVE_LP =
        IERC20(0x7Eb40E450b9655f4B3cC4259BCC731c63ff55ae6);

    // prevent slippage from deposit / withdraw
    uint public slip = 100;
    uint private constant SLIP_MAX = 10000;

    /*
    0 - USDP
    1 - DAI
    2 - USDC
    3 - USDT
    */
    // multipliers to normalize token decimals to 10 ** 18
    uint[4] private MULS = [1, 1, 1e12, 1e12];
    uint private immutable MUL; // multiplier of token
    uint private immutable INDEX; // index of token

    // DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F
    // USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
    // USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7

    constructor(
        address _token,
        address _fundManager,
        address _treasury,
        uint _index
    ) Strategy(_token, _fundManager, _treasury) {
        // disable USDP
        require(_index > 0, "index = 0");
        INDEX = _index;
        MUL = MULS[_index];

        (address lptoken, , , address crvRewards, , ) = BOOSTER.poolInfo(PID);
        require(address(CURVE_LP) == lptoken, "curve pool lp != pool info lp");
        require(address(REWARD) == crvRewards, "reward != pool info reward");

        IERC20(_token).safeApprove(address(ZAP), type(uint).max);
        // deposit into BOOSTER
        CURVE_LP.safeApprove(address(BOOSTER), type(uint).max);
        // withdraw from ZAP
        CURVE_LP.safeApprove(address(ZAP), type(uint).max);

        _setDex(0, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CRV - sushiswap
        _setDex(1, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CVX - sushiswap
    }

    function _setDex(uint _i, address _dex) private {
        IERC20 reward = IERC20(REWARDS[_i]);

        // disallow previous dex
        if (dex[_i] != address(0)) {
            reward.safeApprove(dex[_i], 0);
        }

        dex[_i] = _dex;

        // approve new dex
        reward.safeApprove(_dex, type(uint).max);
    }

    function setDex(uint _i, address _dex) external onlyTimeLock {
        require(_dex != address(0), "dex = 0 address");
        _setDex(_i, _dex);
    }

    /*
    @notice Set max slippage for deposit and withdraw from Curve pool
    @param _slip Max amount of slippage allowed
    */
    function setSlip(uint _slip) external onlyAuthorized {
        require(_slip <= SLIP_MAX, "slip > max");
        slip = _slip;
    }

    // @dev Claim extra rewards from Convex
    function setShouldClaimExtras(bool _shouldClaimExtras) external onlyAuthorized {
        shouldClaimExtras = _shouldClaimExtras;
    }

    function _totalAssets() private view returns (uint total) {
        /*
        s0 = shares in meta pool
        p0 = price per share of meta pool
        s1 = shares in base pool
        p1 = price per share of base pool
        a = amount of tokens (DAI, USDC, USDT)

        s1 = s0 * p0
        a = s1 * p1

        a = s0 * p0 * p1
        */
        // amount of Curve LP tokens in Convex
        uint lpBal = REWARD.balanceOf(address(this));
        // amount of USDP or DAI, USDC, USDT converted from Curve LP
        // BASE_POOL.get_virtual_price is included in CURVE_POOL.get_virtual_price
        // so CURVE_POOL.get_virtual_price = p0 * p1
        total = lpBal.mul(CURVE_POOL.get_virtual_price()) / (MUL * 1e18);

        total = total.add(token.balanceOf(address(this)));
    }

    function totalAssets() external view override returns (uint) {
        return _totalAssets();
    }

    function _deposit() private {
        uint bal = token.balanceOf(address(this));
        if (bal > 0) {
            uint[4] memory amounts;
            amounts[INDEX] = bal;
            /*
            shares = token amount * multiplier * 1e18 / price per share
            */
            uint pricePerShare = CURVE_POOL.get_virtual_price();
            uint shares = bal.mul(MUL).mul(1e18).div(pricePerShare);
            uint min = shares.mul(SLIP_MAX - slip) / SLIP_MAX;

            ZAP.add_liquidity(amounts, min);
        }

        uint lpBal = CURVE_LP.balanceOf(address(this));
        if (lpBal > 0) {
            require(BOOSTER.deposit(PID, lpBal, true), "deposit failed");
        }
    }

    function deposit(uint _amount, uint _min) external override onlyAuthorized {
        require(_amount > 0, "deposit = 0");

        uint borrowed = fundManager.borrow(_amount);
        require(borrowed >= _min, "borrowed < min");

        _deposit();
        emit Deposit(_amount, borrowed);
    }

    function _calcSharesToWithdraw(
        uint _amount,
        uint _total,
        uint _totalShares
    ) private pure returns (uint) {
        /*
        calculate shares to withdraw

        a = amount of token to withdraw
        T = total amount of token locked in external liquidity pool
        s = shares to withdraw
        P = total shares deposited into external liquidity pool

        a / T = s / P
        s = a / T * P
        */
        if (_total > 0) {
            // avoid rounding errors and cap shares to be <= total shares
            if (_amount >= _total) {
                return _totalShares;
            }
            return _amount.mul(_totalShares) / _total;
        }
        return 0;
    }

    function _withdraw(uint _amount) private returns (uint) {
        uint bal = token.balanceOf(address(this));
        if (_amount <= bal) {
            return _amount;
        }

        uint total = _totalAssets();

        if (_amount >= total) {
            _amount = total;
        }

        uint need = _amount - bal;
        uint totalShares = REWARD.balanceOf(address(this));
        // total assets is always >= bal
        uint shares = _calcSharesToWithdraw(need, total - bal, totalShares);

        // withdraw from Convex
        if (shares > 0) {
            // true = claim CRV
            require(REWARD.withdrawAndUnwrap(shares, false), "reward withdraw failed");
        }

        // withdraw from Curve
        uint lpBal = CURVE_LP.balanceOf(address(this));
        if (shares > lpBal) {
            shares = lpBal;
        }

        if (shares > 0) {
            uint min = need.mul(SLIP_MAX - slip) / SLIP_MAX;
            ZAP.remove_liquidity_one_coin(shares, int128(INDEX), min);
        }

        uint balAfter = token.balanceOf(address(this));
        if (balAfter < _amount) {
            return balAfter;
        }
        // balAfter >= _amount >= total
        // requested to withdraw all so return balAfter
        if (_amount >= total) {
            return balAfter;
        }
        // requested withdraw < all
        return _amount;
    }

    function withdraw(uint _amount)
        external
        override
        onlyFundManager
        returns (uint loss)
    {
        require(_amount > 0, "withdraw = 0");

        // availabe <= _amount
        uint available = _withdraw(_amount);

        uint debt = fundManager.getDebt(address(this));
        uint total = _totalAssets();
        if (debt > total) {
            loss = debt - total;
        }

        if (available > 0) {
            token.safeTransfer(msg.sender, available);
        }

        emit Withdraw(_amount, available, loss);
    }

    function repay(uint _amount, uint _min) external override onlyAuthorized {
        require(_amount > 0, "repay = 0");
        // availabe <= _amount
        uint available = _withdraw(_amount);
        uint repaid = fundManager.repay(available);
        require(repaid >= _min, "repaid < min");

        emit Repay(_amount, repaid);
    }

    /*
    @dev Uniswap fails with zero address so no check is necessary here
    */
    function _swap(
        address _dex,
        address _tokenIn,
        address _tokenOut,
        uint _amount
    ) private {
        // create dynamic array with 3 elements
        address[] memory path = new address[](3);
        path[0] = _tokenIn;
        path[1] = WETH;
        path[2] = _tokenOut;

        UniswapV2Router(_dex).swapExactTokensForTokens(
            _amount,
            1,
            path,
            address(this),
            block.timestamp
        );
    }

    function _claimRewards(uint _minProfit) private {
        // calculate profit = balance of token after - balance of token before
        uint diff = token.balanceOf(address(this));

        require(
            REWARD.getReward(address(this), shouldClaimExtras),
            "get reward failed"
        );

        for (uint i = 0; i < NUM_REWARDS; i++) {
            uint rewardBal = IERC20(REWARDS[i]).balanceOf(address(this));
            if (rewardBal > 0) {
                _swap(dex[i], REWARDS[i], address(token), rewardBal);
            }
        }

        diff = token.balanceOf(address(this)) - diff;
        require(diff >= _minProfit, "profit < min");

        // transfer performance fee to treasury
        if (diff > 0) {
            uint fee = diff.mul(perfFee) / PERF_FEE_MAX;
            if (fee > 0) {
                token.safeTransfer(treasury, fee);
                diff = diff.sub(fee);
            }
        }

        emit ClaimRewards(diff);
    }

    function claimRewards(uint _minProfit) external override onlyAuthorized {
        _claimRewards(_minProfit);
    }

    function _skim() private {
        uint total = _totalAssets();
        uint debt = fundManager.getDebt(address(this));
        require(total > debt, "total <= debt");

        uint profit = total - debt;
        // reassign to actual amount withdrawn
        profit = _withdraw(profit);

        emit Skim(total, debt, profit);
    }

    function skim() external override onlyAuthorized {
        _skim();
    }

    function _report(uint _minTotal, uint _maxTotal) private {
        uint total = _totalAssets();
        require(total >= _minTotal, "total < min");
        require(total <= _maxTotal, "total > max");

        uint gain = 0;
        uint loss = 0;
        uint free = 0; // balance of token
        uint debt = fundManager.getDebt(address(this));
        if (total > debt) {
            gain = total - debt;

            free = token.balanceOf(address(this));
            if (gain > free) {
                gain = free;
            }
        } else {
            loss = debt - total;
        }

        if (gain > 0 || loss > 0) {
            fundManager.report(gain, loss);
        }

        emit Report(gain, loss, free, total, debt);
    }

    function report(uint _minTotal, uint _maxTotal) external override onlyAuthorized {
        _report(_minTotal, _maxTotal);
    }

    function harvest(
        uint _minProfit,
        uint _minTotal,
        uint _maxTotal
    ) external override onlyAuthorized {
        _claimRewards(_minProfit);
        _skim();
        _report(_minTotal, _maxTotal);
    }

    function migrate(address _strategy) external override onlyFundManager {
        Strategy strat = Strategy(_strategy);
        require(address(strat.token()) == address(token), "strategy token != token");
        require(
            address(strat.fundManager()) == address(fundManager),
            "strategy fund manager != fund manager"
        );

        if (claimRewardsOnMigrate) {
            _claimRewards(1);
        }

        uint bal = _withdraw(type(uint).max);
        token.safeApprove(_strategy, bal);
        strat.transferTokenFrom(address(this), bal);
    }

    /*
    @notice Transfer token accidentally sent here to admin
    @param _token Address of token to transfer
    */
    function sweep(address _token) external override onlyAuthorized {
        for (uint i = 0; i < NUM_REWARDS; i++) {
            require(_token != REWARDS[i], "protected token");
        }
        IERC20(_token).safeTransfer(admin, IERC20(_token).balanceOf(address(this)));
    }
}

interface UniswapV2Router {
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

contract StrategyConvexUsdpDai is StrategyConvexUsdp {
    constructor(address _fundManager, address _treasury)
        StrategyConvexUsdp(
            0x6B175474E89094C44Da98b954EedeAC495271d0F,
            _fundManager,
            _treasury,
            1
        )
    {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_fundManager","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"timeLock","type":"address"}],"name":"AcceptTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"Authorize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowed","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repaid","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gain","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"free","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"}],"name":"Report","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"SetAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fundManager","type":"address"}],"name":"SetFundManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nextTimeLock","type":"address"}],"name":"SetNextTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"Skim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"acceptTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_authorized","type":"bool"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsOnMigrate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundManager","outputs":[{"internalType":"contract IFundManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"},{"internalType":"uint256","name":"_minTotal","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextTimeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perfFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTotal","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"report","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_claimRewards","type":"bool"}],"name":"setClaimRewardsOnMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_i","type":"uint256"},{"internalType":"address","name":"_dex","type":"address"}],"name":"setDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundManager","type":"address"}],"name":"setFundManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextTimeLock","type":"address"}],"name":"setNextTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setPerfFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldClaimExtras","type":"bool"}],"name":"setShouldClaimExtras","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slip","type":"uint256"}],"name":"setSlip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldClaimExtras","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

6103e86006556007805460ff1916600117905561012060405273d533a949740bb3306d119cc777fa900ba034cd5260e0908152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b610100526200005b90600a90600262000a5b565b50600c805460ff191660019081179091556064600d5560408051608081018252828152602081019290925264e8d4a510009082018190526060820152620000a790600e90600462000ab8565b50348015620000b557600080fd5b506040516200448b3803806200448b83398181016040526040811015620000db57600080fd5b508051602090910151736b175474e89094c44da98b954eedeac495271d0f828260018383836001600160a01b0381166200015c576040805162461bcd60e51b815260206004820152601460248201527f7472656173757279203d20302061646472657373000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b031990811633908117909255600280548216909217909155600380546001600160a01b038481169190931617905560408051637e062a3560e11b815290518583169285169163fc0c546a916004808301926020929190829003018186803b158015620001d257600080fd5b505afa158015620001e7573d6000803e3d6000fd5b505050506040513d6020811015620001fe57600080fd5b50516001600160a01b0316146200025c576040805162461bcd60e51b815260206004820152601b60248201527f66756e64206d616e6167657220746f6b656e20213d20746f6b656e0000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155606084901b6001600160601b031916608052620002ab908416836000196200058f602090811b62001c1d17901c565b50505060008111620002f0576040805162461bcd60e51b81526020600482015260096024820152680696e646578203d20360bc1b604482015290519081900360640190fd5b60c0819052600e81600481106200030357fe5b015460a05260408051631526fe2760e01b8152601c60048201529051600091829173f403c135812408bfbe8713b5a23a04b3d48aae3191631526fe279160248083019260c0929190829003018186803b1580156200036057600080fd5b505afa15801562000375573d6000803e3d6000fd5b505050506040513d60c08110156200038c57600080fd5b5080516060909101519092509050737eb40e450b9655f4b3cc4259bcc731c63ff55ae66001600160a01b038316146200040c576040805162461bcd60e51b815260206004820152601d60248201527f637572766520706f6f6c206c7020213d20706f6f6c20696e666f206c70000000604482015290519081900360640190fd5b7324dffd1949f888f91a0c8341fc98a3f280a782a86001600160a01b038216146200047e576040805162461bcd60e51b815260206004820152601a60248201527f72657761726420213d20706f6f6c20696e666f20726577617264000000000000604482015290519081900360640190fd5b620004b9733c8caee4e09296800f8d29a68fa3837e2dae4940600019886001600160a01b03166200058f60201b62001c1d179092919060201c565b620004fc737eb40e450b9655f4b3cc4259bcc731c63ff55ae673f403c135812408bfbe8713b5a23a04b3d48aae316000196200058f602090811b62001c1d17901c565b6200053f737eb40e450b9655f4b3cc4259bcc731c63ff55ae6733c8caee4e09296800f8d29a68fa3837e2dae49406000196200058f602090811b62001c1d17901c565b62000560600073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006b3565b62000581600173d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006b3565b505050505050505062000b09565b80158062000619575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015620005e957600080fd5b505afa158015620005fe573d6000803e3d6000fd5b505050506040513d60208110156200061557600080fd5b5051155b620006565760405162461bcd60e51b8152600401808060200182810382526036815260200180620044556036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620006ae9185916200076d16565b505050565b6000600a8360028110620006c357fe5b01546001600160a01b03169050600060088460028110620006e057fe5b01546001600160a01b031614620007265762000726600884600281106200070357fe5b01546001600160a01b03838116911660006200058f602090811b62001c1d17901c565b81600884600281106200073557fe5b0180546001600160a01b0319166001600160a01b03928316179055620006ae908216836000196200058f602090811b62001c1d17901c565b6000620007c9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200082960201b62001d30179092919060201c565b805190915015620006ae57808060200190516020811015620007ea57600080fd5b5051620006ae5760405162461bcd60e51b815260040180806020018281038252602a8152602001806200442b602a913960400191505060405180910390fd5b60606200083a848460008562000844565b90505b9392505050565b606082471015620008875760405162461bcd60e51b8152600401808060200182810382526026815260200180620044056026913960400191505060405180910390fd5b6200089285620009ab565b620008e4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310620009245780518252601f19909201916020918201910162000903565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811462000988576040519150601f19603f3d011682016040523d82523d6000602084013e6200098d565b606091505b509092509050620009a0828286620009b1565b979650505050505050565b3b151590565b60608315620009c25750816200083d565b825115620009d35782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000a1f57818101518382015260200162000a05565b50505050905090810190601f16801562000a4d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b826002810192821562000aa6579160200282015b8281111562000aa657825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000a6f565b5062000ab492915062000af2565b5090565b826004810192821562000aa6579160200282015b8281111562000aa6578251829064ffffffffff1690559160200191906001019062000acc565b5b8082111562000ab4576000815560010162000af3565b60805160601c60a05160c05161387262000b9360003980612ac45280612d79525080611e3b5280612e405250806108385280610abc5280610ae85280610bf65280610f6f52806114ec52806116bd5280611bfb5280611ede5280611f8652806121c152806121f35280612312528061264152806127a95280612b5d5280612cce52506138726000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806347a02a441161011a578063b157eacf116100ad578063d8aed1451161007c578063d8aed1451461052c578063e2bbb1581461054f578063f0f4426014610572578063f851a44014610598578063fc0c546a146105a057610206565b8063b157eacf146104d0578063b9181611146104d8578063ce5494bb146104fe578063d085835a1461052457610206565b80637372bb41116100e95780637372bb411461045c578063753c0985146104795780638a36bef71461049c578063b127df87146104c857610206565b806347a02a441461040057806361d027b3146104265780636209ec2d1461042e578063704b6c021461043657610206565b8063232a30601161019d5780632e1a7d4d1161016c5780632e1a7d4d146103815780633739795c1461039e57806338c2eae5146103bd578063392c731f146103dc57806342d14c83146103e457610206565b8063232a3060146102cb57806324d16c1a146102f1578063284fa3441461032a5780632d1fb3891461035357610206565b806313b857b4116101d957806313b857b4146102965780631dd19cb4146102b35780631e39831e146102bb57806322b2ba73146102c357610206565b806301681a621461020b57806301e1d114146102335780630962ef791461024d5780630acf84811461026a575b600080fd5b6102316004803603602081101561022157600080fd5b50356001600160a01b03166105a8565b005b61023b610727565b60408051918252519081900360200190f35b6102316004803603602081101561026357600080fd5b5035610736565b6102316004803603604081101561028057600080fd5b506001600160a01b0381351690602001356107b5565b610231600480360360208110156102ac57600080fd5b5035610864565b610231610923565b6102316109a3565b61023b610a48565b610231600480360360208110156102e157600080fd5b50356001600160a01b0316610a4e565b61030e6004803603602081101561030757600080fd5b5035610c5e565b604080516001600160a01b039092168252519081900360200190f35b6102316004803603606081101561034057600080fd5b5080359060208101359060400135610c7e565b6102316004803603604081101561036957600080fd5b506001600160a01b0381351690602001351515610d14565b61023b6004803603602081101561039757600080fd5b5035610e22565b610231600480360360208110156103b457600080fd5b50351515610fde565b610231600480360360208110156103d357600080fd5b5035151561104d565b61023b6110d6565b6103ec6110dc565b604080519115158252519081900360200190f35b6102316004803603602081101561041657600080fd5b50356001600160a01b03166110e5565b61030e611185565b61030e611194565b6102316004803603602081101561044c57600080fd5b50356001600160a01b03166111a3565b6102316004803603602081101561047257600080fd5b50356112a2565b6102316004803603604081101561048f57600080fd5b5080359060200135611346565b610231600480360360408110156104b257600080fd5b50803590602001356001600160a01b03166113c6565b61030e611469565b6103ec611478565b6103ec600480360360208110156104ee57600080fd5b50356001600160a01b0316611481565b6102316004803603602081101561051457600080fd5b50356001600160a01b0316611496565b61030e61174f565b6102316004803603604081101561054257600080fd5b508035906020013561175e565b6102316004803603604081101561056557600080fd5b5080359060200135611926565b6102316004803603602081101561058857600080fd5b50356001600160a01b0316611ae8565b61030e611bea565b61030e611bf9565b6000546001600160a01b03163314806105cb57506002546001600160a01b031633145b806105e557503360009081526004602052604090205460ff165b61061e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60005b600281101561069357600a816002811061063757fe5b01546001600160a01b038381169116141561068b576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b600101610621565b50600254604080516370a0823160e01b81523060048201529051610724926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b1580156106e757600080fd5b505afa1580156106fb573d6000803e3d6000fd5b505050506040513d602081101561071157600080fd5b50516001600160a01b0384169190611d49565b50565b6000610731611d9b565b905090565b6000546001600160a01b031633148061075957506002546001600160a01b031633145b8061077357503360009081526004602052604090205460ff165b6107ac576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61072481611f82565b6000546001600160a01b03163314806107d857506002546001600160a01b031633145b806107f257503360009081526004602052604090205460ff165b61082b576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016833084612381565b5050565b6000546001600160a01b031633148061088757506002546001600160a01b031633145b806108a157503360009081526004602052604090205460ff165b6108da576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61271081111561091e576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600d55565b6000546001600160a01b031633148061094657506002546001600160a01b031633145b8061096057503360009081526004602052604090205460ff165b610999576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109a16123e1565b565b6001546001600160a01b031633146109f4576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610a9a576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610ae657600554610ae6906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691166000611c1d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4957600080fd5b505afa158015610b5d573d6000803e3d6000fd5b505050506040513d6020811015610b7357600080fd5b50516001600160a01b031614610bd0576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610c1f907f00000000000000000000000000000000000000000000000000000000000000001682600019611c1d565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160028110610c6e57600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610ca157506002546001600160a01b031633145b80610cbb57503360009081526004602052604090205460ff165b610cf4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610cfd83611f82565b610d056123e1565b610d0f8282612503565b505050565b6000546001600160a01b0316331480610d3757506002546001600160a01b031633145b610d70576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610dbe576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610e74576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610eb8576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610ec3836127a4565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f1457600080fd5b505afa158015610f28573d6000803e3d6000fd5b505050506040513d6020811015610f3e57600080fd5b505190506000610f4c611d9b565b905080821115610f5c5780820393505b8215610f9657610f966001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163385611d49565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061100157506002546001600160a01b031633145b61103a576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b031633148061107057506002546001600160a01b031633145b8061108a57503360009081526004602052604090205460ff165b6110c3576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600c805460ff1916911515919091179055565b600d5481565b60075460ff1681565b6000546001600160a01b03163314611131576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b03163314806111c657506002546001600160a01b031633145b6111ff576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661124e576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b03163314806112c557506002546001600160a01b031633145b6112fe576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d0811115611341576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b031633148061136957506002546001600160a01b031633145b8061138357503360009081526004602052604090205460ff165b6113bc576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108608282612503565b6000546001600160a01b03163314611412576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b03811661145f576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b6108608282612c31565b6001546001600160a01b031681565b600c5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b031633146114e5576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561154d57600080fd5b505afa158015611561573d6000803e3d6000fd5b505050506040513d602081101561157757600080fd5b50516001600160a01b0316146115d4576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561161b57600080fd5b505afa15801561162f573d6000803e3d6000fd5b505050506040513d602081101561164557600080fd5b50516001600160a01b03161461168c5760405162461bcd60e51b81526004018080602001828103825260258152602001806137976025913960400191505060405180910390fd5b60075460ff16156116a1576116a16001611f82565b60006116ae6000196127a4565b90506116e46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483611c1d565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b15801561173257600080fd5b505af1158015611746573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b6000546001600160a01b031633148061178157506002546001600160a01b031633145b8061179b57503360009081526004602052604090205460ff165b6117d4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611815576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b6000611820836127a4565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b15801561187357600080fd5b505af1158015611887573d6000803e3d6000fd5b505050506040513d602081101561189d57600080fd5b50519050828110156118e5576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b031633148061194957506002546001600160a01b031633145b8061196357503360009081526004602052604090205460ff165b61199c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600082116119df576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611a2c57600080fd5b505af1158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905081811015611aa0576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611aa8612cca565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611b0b57506002546001600160a01b031633145b611b44576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611b96576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580611ca3575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611c7557600080fd5b505afa158015611c89573d6000803e3d6000fd5b505050506040513d6020811015611c9f57600080fd5b5051155b611cde5760405162461bcd60e51b81526004018080602001828103825260368152602001806138076036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d0f9084906130a2565b6060611d3f8484600085613153565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d0f9084906130a2565b604080516370a0823160e01b8152306004820152905160009182917324dffd1949f888f91a0c8341fc98a3f280a782a8916370a08231916024808301926020929190829003018186803b158015611df157600080fd5b505afa158015611e05573d6000803e3d6000fd5b505050506040513d6020811015611e1b57600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000000291611ecf917342d7025938bec20b69cbae5a77421082407f053a9163bb7b8b8091600480820192602092909190829003018186803b158015611e9c57600080fd5b505afa158015611eb0573d6000803e3d6000fd5b505050506040513d6020811015611ec657600080fd5b505183906132ae565b81611ed657fe5b049150611f7c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f4957600080fd5b505afa158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b50518390613310565b91505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ff157600080fd5b505afa158015612005573d6000803e3d6000fd5b505050506040513d602081101561201b57600080fd5b5051600c5460408051637050ccd960e01b815230600482015260ff90921615156024830152519192507324dffd1949f888f91a0c8341fc98a3f280a782a891637050ccd9916044808201926020929091908290030181600087803b15801561208257600080fd5b505af1158015612096573d6000803e3d6000fd5b505050506040513d60208110156120ac57600080fd5b50516120f3576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b60028110156121ef576000600a826002811061210e57fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561215857600080fd5b505afa15801561216c573d6000803e3d6000fd5b505050506040513d602081101561218257600080fd5b5051905080156121e6576121e66008836002811061219c57fe5b01546001600160a01b0316600a84600281106121b457fe5b01546001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008461336a565b506001016120f6565b50807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561225e57600080fd5b505afa158015612272573d6000803e3d6000fd5b505050506040513d602081101561228857600080fd5b5051039050818110156122d1576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b801561234a5760006127106122f1600654846132ae90919063ffffffff16565b816122f857fe5b04905080156123485760035461233b906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683611d49565b61234582826135aa565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526123db9085906130a2565b50505050565b60006123eb611d9b565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d602081101561246657600080fd5b505190508082116124ae576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036124ba816127a4565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b600061250d611d9b565b905082811015612552576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b81811115612595576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b1580156125e657600080fd5b505afa1580156125fa573d6000803e3d6000fd5b505050506040513d602081101561261057600080fd5b50519050808511156126c657604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561268757600080fd5b505afa15801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b50519150818411156126c1578193505b6126cc565b84810392505b60008411806126db5750600083115b1561274d576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b15801561273457600080fd5b505af1158015612748573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d602081101561283e57600080fd5b505190508083116128525782915050612c2c565b600061285c611d9b565b9050808410612869578093505b604080516370a0823160e01b81523060048201529051838603916000917324dffd1949f888f91a0c8341fc98a3f280a782a8916370a08231916024808301926020929190829003018186803b1580156128c157600080fd5b505afa1580156128d5573d6000803e3d6000fd5b505050506040513d60208110156128eb57600080fd5b5051905060006128fe8386860384613607565b905080156129e1577324dffd1949f888f91a0c8341fc98a3f280a782a86001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b15801561296b57600080fd5b505af115801561297f573d6000803e3d6000fd5b505050506040513d602081101561299557600080fd5b50516129e1576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b81523060048201529051600091737eb40e450b9655f4b3cc4259bcc731c63ff55ae6916370a0823191602480820192602092909190829003018186803b158015612a3657600080fd5b505afa158015612a4a573d6000803e3d6000fd5b505050506040513d6020811015612a6057600080fd5b5051905080821115612a70578091505b8115612b59576000612710612a94600d5461271003876132ae90919063ffffffff16565b81612a9b57fe5b049050733c8caee4e09296800f8d29a68fa3837e2dae49406001600160a01b0316631a4d01d2847f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b81526004018084815260200183600f0b81526020018281526020019350505050602060405180830381600087803b158015612b2b57600080fd5b505af1158015612b3f573d6000803e3d6000fd5b505050506040513d6020811015612b5557600080fd5b5050505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bc857600080fd5b505afa158015612bdc573d6000803e3d6000fd5b505050506040513d6020811015612bf257600080fd5b5051905088811015612c0c579650612c2c95505050505050565b858910612c21579650612c2c95505050505050565b889750505050505050505b919050565b6000600a8360028110612c4057fe5b01546001600160a01b03169050600060088460028110612c5c57fe5b01546001600160a01b031614612c9257612c9260088460028110612c7c57fe5b01546001600160a01b0383811691166000611c1d565b8160088460028110612ca057fe5b0180546001600160a01b0319166001600160a01b03928316179055610d0f90821683600019611c1d565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d3957600080fd5b505afa158015612d4d573d6000803e3d6000fd5b505050506040513d6020811015612d6357600080fd5b505190508015612f4957612d75613752565b81817f000000000000000000000000000000000000000000000000000000000000000060048110612da257fe5b60200201818152505060007342d7025938bec20b69cbae5a77421082407f053a6001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015612dfa57600080fd5b505afa158015612e0e573d6000803e3d6000fd5b505050506040513d6020811015612e2457600080fd5b505190506000612e7082612e6a670de0b6b3a7640000612e64887f00000000000000000000000000000000000000000000000000000000000000006132ae565b906132ae565b90613641565b90506000612710612e90600d5461271003846132ae90919063ffffffff16565b81612e9757fe5b60405162a6cbcd60e21b81529190049150733c8caee4e09296800f8d29a68fa3837e2dae49409063029b2f3490869084906004018083608080838360005b83811015612eed578181015183820152602001612ed5565b5050505090500182815260200192505050602060405180830381600087803b158015612f1857600080fd5b505af1158015612f2c573d6000803e3d6000fd5b505050506040513d6020811015612f4257600080fd5b5050505050505b604080516370a0823160e01b81523060048201529051600091737eb40e450b9655f4b3cc4259bcc731c63ff55ae6916370a0823191602480820192602092909190829003018186803b158015612f9e57600080fd5b505afa158015612fb2573d6000803e3d6000fd5b505050506040513d6020811015612fc857600080fd5b50519050801561086057604080516321d0683360e11b8152601c60048201526024810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b505050506040513d602081101561305e57600080fd5b5051610860576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b60006130f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d309092919063ffffffff16565b805190915015610d0f5780806020019051602081101561311657600080fd5b5051610d0f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806137dd602a913960400191505060405180910390fd5b6060824710156131945760405162461bcd60e51b81526004018080602001828103825260268152602001806137716026913960400191505060405180910390fd5b61319d856136a8565b6131ee576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831061322c5780518252601f19909201916020918201910161320d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461328e576040519150601f19603f3d011682016040523d82523d6000602084013e613293565b606091505b50915091506132a38282866136ae565b979650505050505050565b6000826132bd5750600061330a565b828202828482816132ca57fe5b04146133075760405162461bcd60e51b81526004018080602001828103825260218152602001806137bc6021913960400191505060405180910390fd5b90505b92915050565b600082820183811015613307576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160038082526080820190925260009160208201606080368337019050509050838160008151811061339b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106133dd57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061340b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156134b0578181015183820152602001613498565b505050509050019650505050505050600060405180830381600087803b1580156134d957600080fd5b505af11580156134ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561351657600080fd5b810190808051604051939291908464010000000082111561353657600080fd5b90830190602082018581111561354b57600080fd5b825186602082028301116401000000008211171561356857600080fd5b82525081516020918201928201910280838360005b8381101561359557818101518382015260200161357d565b50505050905001604052505050505050505050565b600082821115613601576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156136375782841061361d575080611d42565b8261362885846132ae565b8161362f57fe5b049050611d42565b5060009392505050565b6000808211613697576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816136a057fe5b049392505050565b3b151590565b606083156136bd575081611d42565b8251156136cd5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137175781810151838201526020016136ff565b50505050905090810190601f1680156137445780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060800160405280600490602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220da7f1492f62a935bee96b3e80c210601bcdfa9f84dd22c24ff331b4f443a47ed64736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000000007c765c474d231fd915dc78832b478f309071cba700000000000000000000000086d10751b18f3fe331c146546868a07224a8598b

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c806347a02a441161011a578063b157eacf116100ad578063d8aed1451161007c578063d8aed1451461052c578063e2bbb1581461054f578063f0f4426014610572578063f851a44014610598578063fc0c546a146105a057610206565b8063b157eacf146104d0578063b9181611146104d8578063ce5494bb146104fe578063d085835a1461052457610206565b80637372bb41116100e95780637372bb411461045c578063753c0985146104795780638a36bef71461049c578063b127df87146104c857610206565b806347a02a441461040057806361d027b3146104265780636209ec2d1461042e578063704b6c021461043657610206565b8063232a30601161019d5780632e1a7d4d1161016c5780632e1a7d4d146103815780633739795c1461039e57806338c2eae5146103bd578063392c731f146103dc57806342d14c83146103e457610206565b8063232a3060146102cb57806324d16c1a146102f1578063284fa3441461032a5780632d1fb3891461035357610206565b806313b857b4116101d957806313b857b4146102965780631dd19cb4146102b35780631e39831e146102bb57806322b2ba73146102c357610206565b806301681a621461020b57806301e1d114146102335780630962ef791461024d5780630acf84811461026a575b600080fd5b6102316004803603602081101561022157600080fd5b50356001600160a01b03166105a8565b005b61023b610727565b60408051918252519081900360200190f35b6102316004803603602081101561026357600080fd5b5035610736565b6102316004803603604081101561028057600080fd5b506001600160a01b0381351690602001356107b5565b610231600480360360208110156102ac57600080fd5b5035610864565b610231610923565b6102316109a3565b61023b610a48565b610231600480360360208110156102e157600080fd5b50356001600160a01b0316610a4e565b61030e6004803603602081101561030757600080fd5b5035610c5e565b604080516001600160a01b039092168252519081900360200190f35b6102316004803603606081101561034057600080fd5b5080359060208101359060400135610c7e565b6102316004803603604081101561036957600080fd5b506001600160a01b0381351690602001351515610d14565b61023b6004803603602081101561039757600080fd5b5035610e22565b610231600480360360208110156103b457600080fd5b50351515610fde565b610231600480360360208110156103d357600080fd5b5035151561104d565b61023b6110d6565b6103ec6110dc565b604080519115158252519081900360200190f35b6102316004803603602081101561041657600080fd5b50356001600160a01b03166110e5565b61030e611185565b61030e611194565b6102316004803603602081101561044c57600080fd5b50356001600160a01b03166111a3565b6102316004803603602081101561047257600080fd5b50356112a2565b6102316004803603604081101561048f57600080fd5b5080359060200135611346565b610231600480360360408110156104b257600080fd5b50803590602001356001600160a01b03166113c6565b61030e611469565b6103ec611478565b6103ec600480360360208110156104ee57600080fd5b50356001600160a01b0316611481565b6102316004803603602081101561051457600080fd5b50356001600160a01b0316611496565b61030e61174f565b6102316004803603604081101561054257600080fd5b508035906020013561175e565b6102316004803603604081101561056557600080fd5b5080359060200135611926565b6102316004803603602081101561058857600080fd5b50356001600160a01b0316611ae8565b61030e611bea565b61030e611bf9565b6000546001600160a01b03163314806105cb57506002546001600160a01b031633145b806105e557503360009081526004602052604090205460ff165b61061e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60005b600281101561069357600a816002811061063757fe5b01546001600160a01b038381169116141561068b576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b600101610621565b50600254604080516370a0823160e01b81523060048201529051610724926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b1580156106e757600080fd5b505afa1580156106fb573d6000803e3d6000fd5b505050506040513d602081101561071157600080fd5b50516001600160a01b0384169190611d49565b50565b6000610731611d9b565b905090565b6000546001600160a01b031633148061075957506002546001600160a01b031633145b8061077357503360009081526004602052604090205460ff165b6107ac576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61072481611f82565b6000546001600160a01b03163314806107d857506002546001600160a01b031633145b806107f257503360009081526004602052604090205460ff165b61082b576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108606001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16833084612381565b5050565b6000546001600160a01b031633148061088757506002546001600160a01b031633145b806108a157503360009081526004602052604090205460ff165b6108da576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61271081111561091e576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600d55565b6000546001600160a01b031633148061094657506002546001600160a01b031633145b8061096057503360009081526004602052604090205460ff165b610999576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109a16123e1565b565b6001546001600160a01b031633146109f4576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610a9a576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610ae657600554610ae6906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f811691166000611c1d565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4957600080fd5b505afa158015610b5d573d6000803e3d6000fd5b505050506040513d6020811015610b7357600080fd5b50516001600160a01b031614610bd0576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610c1f907f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f1682600019611c1d565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160028110610c6e57600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610ca157506002546001600160a01b031633145b80610cbb57503360009081526004602052604090205460ff165b610cf4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610cfd83611f82565b610d056123e1565b610d0f8282612503565b505050565b6000546001600160a01b0316331480610d3757506002546001600160a01b031633145b610d70576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610dbe576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610e74576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610eb8576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610ec3836127a4565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f1457600080fd5b505afa158015610f28573d6000803e3d6000fd5b505050506040513d6020811015610f3e57600080fd5b505190506000610f4c611d9b565b905080821115610f5c5780820393505b8215610f9657610f966001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f163385611d49565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061100157506002546001600160a01b031633145b61103a576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b031633148061107057506002546001600160a01b031633145b8061108a57503360009081526004602052604090205460ff165b6110c3576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600c805460ff1916911515919091179055565b600d5481565b60075460ff1681565b6000546001600160a01b03163314611131576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b03163314806111c657506002546001600160a01b031633145b6111ff576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661124e576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b03163314806112c557506002546001600160a01b031633145b6112fe576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d0811115611341576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b031633148061136957506002546001600160a01b031633145b8061138357503360009081526004602052604090205460ff165b6113bc576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108608282612503565b6000546001600160a01b03163314611412576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b03811661145f576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b6108608282612c31565b6001546001600160a01b031681565b600c5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b031633146114e5576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561154d57600080fd5b505afa158015611561573d6000803e3d6000fd5b505050506040513d602081101561157757600080fd5b50516001600160a01b0316146115d4576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561161b57600080fd5b505afa15801561162f573d6000803e3d6000fd5b505050506040513d602081101561164557600080fd5b50516001600160a01b03161461168c5760405162461bcd60e51b81526004018080602001828103825260258152602001806137976025913960400191505060405180910390fd5b60075460ff16156116a1576116a16001611f82565b60006116ae6000196127a4565b90506116e46001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f168483611c1d565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b15801561173257600080fd5b505af1158015611746573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b6000546001600160a01b031633148061178157506002546001600160a01b031633145b8061179b57503360009081526004602052604090205460ff165b6117d4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611815576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b6000611820836127a4565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b15801561187357600080fd5b505af1158015611887573d6000803e3d6000fd5b505050506040513d602081101561189d57600080fd5b50519050828110156118e5576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b031633148061194957506002546001600160a01b031633145b8061196357503360009081526004602052604090205460ff165b61199c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600082116119df576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611a2c57600080fd5b505af1158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905081811015611aa0576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611aa8612cca565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611b0b57506002546001600160a01b031633145b611b44576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611b96576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b801580611ca3575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611c7557600080fd5b505afa158015611c89573d6000803e3d6000fd5b505050506040513d6020811015611c9f57600080fd5b5051155b611cde5760405162461bcd60e51b81526004018080602001828103825260368152602001806138076036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d0f9084906130a2565b6060611d3f8484600085613153565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d0f9084906130a2565b604080516370a0823160e01b8152306004820152905160009182917324dffd1949f888f91a0c8341fc98a3f280a782a8916370a08231916024808301926020929190829003018186803b158015611df157600080fd5b505afa158015611e05573d6000803e3d6000fd5b505050506040513d6020811015611e1b57600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000010291611ecf917342d7025938bec20b69cbae5a77421082407f053a9163bb7b8b8091600480820192602092909190829003018186803b158015611e9c57600080fd5b505afa158015611eb0573d6000803e3d6000fd5b505050506040513d6020811015611ec657600080fd5b505183906132ae565b81611ed657fe5b049150611f7c7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611f4957600080fd5b505afa158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b50518390613310565b91505090565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ff157600080fd5b505afa158015612005573d6000803e3d6000fd5b505050506040513d602081101561201b57600080fd5b5051600c5460408051637050ccd960e01b815230600482015260ff90921615156024830152519192507324dffd1949f888f91a0c8341fc98a3f280a782a891637050ccd9916044808201926020929091908290030181600087803b15801561208257600080fd5b505af1158015612096573d6000803e3d6000fd5b505050506040513d60208110156120ac57600080fd5b50516120f3576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b60028110156121ef576000600a826002811061210e57fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561215857600080fd5b505afa15801561216c573d6000803e3d6000fd5b505050506040513d602081101561218257600080fd5b5051905080156121e6576121e66008836002811061219c57fe5b01546001600160a01b0316600a84600281106121b457fe5b01546001600160a01b03167f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8461336a565b506001016120f6565b50807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561225e57600080fd5b505afa158015612272573d6000803e3d6000fd5b505050506040513d602081101561228857600080fd5b5051039050818110156122d1576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b801561234a5760006127106122f1600654846132ae90919063ffffffff16565b816122f857fe5b04905080156123485760035461233b906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8116911683611d49565b61234582826135aa565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526123db9085906130a2565b50505050565b60006123eb611d9b565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d602081101561246657600080fd5b505190508082116124ae576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036124ba816127a4565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b600061250d611d9b565b905082811015612552576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b81811115612595576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b1580156125e657600080fd5b505afa1580156125fa573d6000803e3d6000fd5b505050506040513d602081101561261057600080fd5b50519050808511156126c657604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16916370a08231916024808301926020929190829003018186803b15801561268757600080fd5b505afa15801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b50519150818411156126c1578193505b6126cc565b84810392505b60008411806126db5750600083115b1561274d576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b15801561273457600080fd5b505af1158015612748573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d602081101561283e57600080fd5b505190508083116128525782915050612c2c565b600061285c611d9b565b9050808410612869578093505b604080516370a0823160e01b81523060048201529051838603916000917324dffd1949f888f91a0c8341fc98a3f280a782a8916370a08231916024808301926020929190829003018186803b1580156128c157600080fd5b505afa1580156128d5573d6000803e3d6000fd5b505050506040513d60208110156128eb57600080fd5b5051905060006128fe8386860384613607565b905080156129e1577324dffd1949f888f91a0c8341fc98a3f280a782a86001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b15801561296b57600080fd5b505af115801561297f573d6000803e3d6000fd5b505050506040513d602081101561299557600080fd5b50516129e1576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b81523060048201529051600091737eb40e450b9655f4b3cc4259bcc731c63ff55ae6916370a0823191602480820192602092909190829003018186803b158015612a3657600080fd5b505afa158015612a4a573d6000803e3d6000fd5b505050506040513d6020811015612a6057600080fd5b5051905080821115612a70578091505b8115612b59576000612710612a94600d5461271003876132ae90919063ffffffff16565b81612a9b57fe5b049050733c8caee4e09296800f8d29a68fa3837e2dae49406001600160a01b0316631a4d01d2847f0000000000000000000000000000000000000000000000000000000000000001846040518463ffffffff1660e01b81526004018084815260200183600f0b81526020018281526020019350505050602060405180830381600087803b158015612b2b57600080fd5b505af1158015612b3f573d6000803e3d6000fd5b505050506040513d6020811015612b5557600080fd5b5050505b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bc857600080fd5b505afa158015612bdc573d6000803e3d6000fd5b505050506040513d6020811015612bf257600080fd5b5051905088811015612c0c579650612c2c95505050505050565b858910612c21579650612c2c95505050505050565b889750505050505050505b919050565b6000600a8360028110612c4057fe5b01546001600160a01b03169050600060088460028110612c5c57fe5b01546001600160a01b031614612c9257612c9260088460028110612c7c57fe5b01546001600160a01b0383811691166000611c1d565b8160088460028110612ca057fe5b0180546001600160a01b0319166001600160a01b03928316179055610d0f90821683600019611c1d565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d3957600080fd5b505afa158015612d4d573d6000803e3d6000fd5b505050506040513d6020811015612d6357600080fd5b505190508015612f4957612d75613752565b81817f000000000000000000000000000000000000000000000000000000000000000160048110612da257fe5b60200201818152505060007342d7025938bec20b69cbae5a77421082407f053a6001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015612dfa57600080fd5b505afa158015612e0e573d6000803e3d6000fd5b505050506040513d6020811015612e2457600080fd5b505190506000612e7082612e6a670de0b6b3a7640000612e64887f00000000000000000000000000000000000000000000000000000000000000016132ae565b906132ae565b90613641565b90506000612710612e90600d5461271003846132ae90919063ffffffff16565b81612e9757fe5b60405162a6cbcd60e21b81529190049150733c8caee4e09296800f8d29a68fa3837e2dae49409063029b2f3490869084906004018083608080838360005b83811015612eed578181015183820152602001612ed5565b5050505090500182815260200192505050602060405180830381600087803b158015612f1857600080fd5b505af1158015612f2c573d6000803e3d6000fd5b505050506040513d6020811015612f4257600080fd5b5050505050505b604080516370a0823160e01b81523060048201529051600091737eb40e450b9655f4b3cc4259bcc731c63ff55ae6916370a0823191602480820192602092909190829003018186803b158015612f9e57600080fd5b505afa158015612fb2573d6000803e3d6000fd5b505050506040513d6020811015612fc857600080fd5b50519050801561086057604080516321d0683360e11b8152601c60048201526024810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b505050506040513d602081101561305e57600080fd5b5051610860576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b60006130f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d309092919063ffffffff16565b805190915015610d0f5780806020019051602081101561311657600080fd5b5051610d0f5760405162461bcd60e51b815260040180806020018281038252602a8152602001806137dd602a913960400191505060405180910390fd5b6060824710156131945760405162461bcd60e51b81526004018080602001828103825260268152602001806137716026913960400191505060405180910390fd5b61319d856136a8565b6131ee576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831061322c5780518252601f19909201916020918201910161320d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461328e576040519150601f19603f3d011682016040523d82523d6000602084013e613293565b606091505b50915091506132a38282866136ae565b979650505050505050565b6000826132bd5750600061330a565b828202828482816132ca57fe5b04146133075760405162461bcd60e51b81526004018080602001828103825260218152602001806137bc6021913960400191505060405180910390fd5b90505b92915050565b600082820183811015613307576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160038082526080820190925260009160208201606080368337019050509050838160008151811061339b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106133dd57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160028151811061340b57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156134b0578181015183820152602001613498565b505050509050019650505050505050600060405180830381600087803b1580156134d957600080fd5b505af11580156134ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561351657600080fd5b810190808051604051939291908464010000000082111561353657600080fd5b90830190602082018581111561354b57600080fd5b825186602082028301116401000000008211171561356857600080fd5b82525081516020918201928201910280838360005b8381101561359557818101518382015260200161357d565b50505050905001604052505050505050505050565b600082821115613601576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156136375782841061361d575080611d42565b8261362885846132ae565b8161362f57fe5b049050611d42565b5060009392505050565b6000808211613697576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816136a057fe5b049392505050565b3b151590565b606083156136bd575081611d42565b8251156136cd5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137175781810151838201526020016136ff565b50505050905090810190601f1680156137445780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060800160405280600490602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220da7f1492f62a935bee96b3e80c210601bcdfa9f84dd22c24ff331b4f443a47ed64736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007c765c474d231fd915dc78832b478f309071cba700000000000000000000000086d10751b18f3fe331c146546868a07224a8598b

-----Decoded View---------------
Arg [0] : _fundManager (address): 0x7C765C474D231fd915dc78832b478F309071cba7
Arg [1] : _treasury (address): 0x86d10751B18F3fE331C146546868a07224A8598B

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007c765c474d231fd915dc78832b478f309071cba7
Arg [1] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b


Deployed Bytecode Sourcemap

45679:286:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44919:282;;;;;;;;;;;;;;;;-1:-1:-1;44919:282:0;-1:-1:-1;;;;;44919:282:0;;:::i;:::-;;36590:101;;;:::i;:::-;;;;;;;;;;;;;;;;42482:116;;;;;;;;;;;;;;;;-1:-1:-1;42482:116:0;;:::i;28903:152::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28903:152:0;;;;;;;;:::i;35437:135::-;;;;;;;;;;;;;;;;-1:-1:-1;35437:135:0;;:::i;42958:75::-;;;:::i;26391:218::-;;;:::i;24465:26::-;;;:::i;27858:498::-;;;;;;;;;;;;;;;;-1:-1:-1;27858:498:0;-1:-1:-1;;;;;27858:498:0;;:::i;32102:31::-;;;;;;;;;;;;;;;;-1:-1:-1;32102:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;32102:31:0;;;;;;;;;;;;;;43953:235;;;;;;;;;;;;;;;;-1:-1:-1;43953:235:0;;;;;;;;;;;;:::i;27007:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27007:235:0;;;;;;;;;;:::i;39921:584::-;;;;;;;;;;;;;;;;-1:-1:-1;39921:584:0;;:::i;28573:139::-;;;;;;;;;;;;;;;;-1:-1:-1;28573:139:0;;;;:::i;35625:136::-;;;;;;;;;;;;;;;;-1:-1:-1;35625:136:0;;;;:::i;33275:22::-;;;:::i;24632:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;26046:239;;;;;;;;;;;;;;;;-1:-1:-1;26046:239:0;-1:-1:-1;;;;;26046:239:0;;:::i;24178:23::-;;;:::i;24384:31::-;;;:::i;26692:189::-;;;;;;;;;;;;;;;;-1:-1:-1;26692:189:0;-1:-1:-1;;;;;26692:189:0;;:::i;27704:146::-;;;;;;;;;;;;;;;;-1:-1:-1;27704:146:0;;:::i;43816:129::-;;;;;;;;;;;;;;;;-1:-1:-1;43816:129:0;;;;;;;:::i;35139:154::-;;;;;;;;;;;;;;;;-1:-1:-1;35139:154:0;;;;;;-1:-1:-1;;;;;35139:154:0;;:::i;24117:27::-;;;:::i;32697:36::-;;;:::i;24297:42::-;;;;;;;;;;;;;;;;-1:-1:-1;24297:42:0;-1:-1:-1;;;;;24297:42:0;;:::i;44196:591::-;;;;;;;;;;;;;;;;-1:-1:-1;44196:591:0;-1:-1:-1;;;;;44196:591:0;;:::i;24087:23::-;;;:::i;40513:346::-;;;;;;;;;;;;;;;;-1:-1:-1;40513:346:0;;;;;;;:::i;37426:304::-;;;;;;;;;;;;;;;;-1:-1:-1;37426:304:0;;;;;;;:::i;27334:280::-;;;;;;;;;;;;;;;;-1:-1:-1;27334:280:0;-1:-1:-1;;;;;27334:280:0;;:::i;24151:20::-;;;:::i;24348:29::-;;;:::i;44919:282::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;44999:6:::1;44994:114;31998:1;45011;:15;44994:114;;;45066:7;45074:1;45066:10;;;;;;;;::::0;-1:-1:-1;;;;;45056:20:0;;::::1;45066:10:::0;::::1;45056:20;;45048:48;;;::::0;;-1:-1:-1;;;45048:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45048:48:0;;;;;;;;;;;;;::::1;;45028:3;;44994:114;;;-1:-1:-1::0;45146:5:0::1;::::0;45153:39:::1;::::0;;-1:-1:-1;;;45153:39:0;;45186:4:::1;45153:39;::::0;::::1;::::0;;;45118:75:::1;::::0;-1:-1:-1;;;;;45146:5:0;;::::1;::::0;45153:24;;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45153:39:0;-1:-1:-1;;;;;45118:27:0;::::1;::::0;:75;:27:::1;:75::i;:::-;44919:282:::0;:::o;36590:101::-;36645:4;36669:14;:12;:14::i;:::-;36662:21;;36590:101;:::o;42482:116::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;42565:25:::1;42579:10;42565:13;:25::i;28903:152::-:0;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;28994:53:::1;-1:-1:-1::0;;;;;28994:5:0::1;:22;29017:5:::0;29032:4:::1;29039:7:::0;28994:22:::1;:53::i;:::-;28903:152:::0;;:::o;35437:135::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;33337:5:::1;35509;:17;;35501:40;;;::::0;;-1:-1:-1;;;35501:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35501:40:0;;;;;;;;;;;;;::::1;;35552:4;:12:::0;35437:135::o;42958:75::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;43018:7:::1;:5;:7::i;:::-;42958:75::o:0;26391:218::-;26459:12;;-1:-1:-1;;;;;26459:12:0;26445:10;:26;26437:54;;;;;-1:-1:-1;;;26437:54:0;;;;;;;;;;;;-1:-1:-1;;;26437:54:0;;;;;;;;;;;;;;;26502:8;:21;;-1:-1:-1;;;;;;26502:21:0;;;26513:10;26502:21;;;;;;;26534:25;;;;;;;26575:26;;;;;;;;;;;;;;;;26391:218::o;24465:26::-;;;;:::o;27858:498::-;25374:8;;-1:-1:-1;;;;;25374:8:0;25360:10;:22;25352:45;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;;;;27949:11:::1;::::0;-1:-1:-1;;;;;27949:11:0::1;27941:34:::0;27937:109:::1;;28018:11;::::0;27992:42:::1;::::0;-1:-1:-1;;;;;27992:5:0::1;:17:::0;::::1;::::0;28018:11:::1;;27992:17;:42::i;:::-;28126:5;-1:-1:-1::0;;;;;28080:52:0::1;28093:12;-1:-1:-1::0;;;;;28080:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28080:34:0;-1:-1:-1;;;;;28080:52:0::1;;28058:133;;;::::0;;-1:-1:-1;;;28058:133:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28204:11;:40:::0;;-1:-1:-1;;;;;;28204:40:0::1;-1:-1:-1::0;;;;;28204:40:0;;::::1;::::0;;;::::1;::::0;;;28255:47:::1;::::0;:5:::1;:17;28204:40:::0;-1:-1:-1;;28255:17:0::1;:47::i;:::-;28320:28;::::0;;-1:-1:-1;;;;;28320:28:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;27858:498:::0;:::o;32102:31::-;;;;;;;;;;;;;;-1:-1:-1;;;;;32102:31:0;;-1:-1:-1;32102:31:0;:::o;43953:235::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;44097:25:::1;44111:10;44097:13;:25::i;:::-;44133:7;:5;:7::i;:::-;44151:29;44159:9;44170;44151:7;:29::i;:::-;43953:235:::0;;;:::o;27007:::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27107:19:0;::::1;27099:48;;;::::0;;-1:-1:-1;;;27099:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27099:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;27158:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:31;;-1:-1:-1;;27158:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27205:29;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;27007:235:::0;;:::o;39921:584::-;25817:11;;40032:9;;-1:-1:-1;;;;;25817:11:0;25795:10;:34;25787:60;;;;;-1:-1:-1;;;25787:60:0;;;;;;;;;;;;-1:-1:-1;;;25787:60:0;;;;;;;;;;;;;;;40077:1:::1;40067:7;:11;40059:36;;;::::0;;-1:-1:-1;;;40059:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40059:36:0;;;;;;;;;;;;;::::1;;40140:14;40157:18;40167:7;40157:9;:18::i;:::-;40200:11;::::0;:34:::1;::::0;;-1:-1:-1;;;40200:34:0;;40228:4:::1;40200:34;::::0;::::1;::::0;;;40140:35;;-1:-1:-1;40188:9:0::1;::::0;-1:-1:-1;;;;;40200:11:0;;::::1;::::0;:19:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;;:11;:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40200:34:0;;-1:-1:-1;40245:10:0::1;40258:14;:12;:14::i;:::-;40245:27;;40294:5;40287:4;:12;40283:64;;;40330:5;40323:4;:12;40316:19;;40283:64;40363:13:::0;;40359:87:::1;;40393:41;-1:-1:-1::0;;;;;40393:5:0::1;:18;40412:10;40424:9:::0;40393:18:::1;:41::i;:::-;40463:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;25858:1;;;39921:584:::0;;;:::o;28573:139::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;28667:21:::1;:37:::0;;-1:-1:-1;;28667:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28573:139::o;35625:136::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;35715:17:::1;:38:::0;;-1:-1:-1;;35715:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35625:136::o;33275:22::-;;;;:::o;24632:40::-;;;;;;:::o;26046:239::-;25374:8;;-1:-1:-1;;;;;25374:8:0;25360:10;:22;25352:45;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;;;;26203:12:::1;:28:::0;;-1:-1:-1;;;;;26203:28:0;::::1;-1:-1:-1::0;;;;;;26203:28:0;;::::1;::::0;::::1;::::0;;;26247:30:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26046:239:::0;:::o;24178:23::-;;;-1:-1:-1;;;;;24178:23:0;;:::o;24384:31::-;;;-1:-1:-1;;;;;24384:31:0;;:::o;26692:189::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26774:20:0;::::1;26766:50;;;::::0;;-1:-1:-1;;;26766:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26766:50:0;;;;;;;;;;;;;::::1;;26827:5;:14:::0;;-1:-1:-1;;;;;26827:14:0;::::1;-1:-1:-1::0;;;;;;26827:14:0;;::::1;::::0;::::1;::::0;;;26857:16:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26692:189:::0;:::o;27704:146::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;24535:4:::1;27783;:20;;27775:42;;;::::0;;-1:-1:-1;;;27775:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27775:42:0;;;;;;;;;;;;;::::1;;27828:7;:14:::0;27704:146::o;43816:129::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;43908:29:::1;43916:9;43927;43908:7;:29::i;35139:154::-:0;25374:8;;-1:-1:-1;;;;;25374:8:0;25360:10;:22;25352:45;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;-1:-1:-1;;;25352:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35219:18:0;::::1;35211:46;;;::::0;;-1:-1:-1;;;35211:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35211:46:0;;;;;;;;;;;;;::::1;;35268:17;35276:2;35280:4;35268:7;:17::i;24117:27::-:0;;;-1:-1:-1;;;;;24117:27:0;;:::o;32697:36::-;;;;;;:::o;24297:42::-;;;;;;;;;;;;;;;:::o;44196:591::-;25817:11;;-1:-1:-1;;;;;25817:11:0;25795:10;:34;25787:60;;;;;-1:-1:-1;;;25787:60:0;;;;;;;;;;;;-1:-1:-1;;;25787:60:0;;;;;;;;;;;;;;;44277:14:::1;44303:9;44277:36;;44366:5;-1:-1:-1::0;;;;;44332:40:0::1;44340:5;-1:-1:-1::0;;;;;44340:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44340:13:0;-1:-1:-1;;;;;44332:40:0::1;;44324:76;;;::::0;;-1:-1:-1;;;44324:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;44473:11;::::0;44441:19:::1;::::0;;-1:-1:-1;;;44441:19:0;;;;-1:-1:-1;;;;;44473:11:0;;::::1;::::0;44441:17;::::1;::::0;::::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:17;:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44441:19:0;-1:-1:-1;;;;;44433:52:0::1;;44411:139;;;;-1:-1:-1::0;;;44411:139:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44567:21;::::0;::::1;;44563:70;;;44605:16;44619:1;44605:13;:16::i;:::-;44645:8;44656:25;-1:-1:-1::0;;44656:9:0::1;:25::i;:::-;44645:36:::0;-1:-1:-1;44692:33:0::1;-1:-1:-1::0;;;;;44692:5:0::1;:17;44710:9:::0;44645:36;44692:17:::1;:33::i;:::-;44736:43;::::0;;-1:-1:-1;;;44736:43:0;;44768:4:::1;44736:43;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;44736:23:0;::::1;::::0;::::1;::::0;:43;;;;;-1:-1:-1;;44736:43:0;;;;;;;-1:-1:-1;44736:23:0;:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25858:1;;44196:591:::0;:::o;24087:23::-;;;-1:-1:-1;;;;;24087:23:0;;:::o;40513:346::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;40615:1:::1;40605:7;:11;40597:33;;;::::0;;-1:-1:-1;;;40597:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40597:33:0;;;;;;;;;;;;;::::1;;40673:14;40690:18;40700:7;40690:9;:18::i;:::-;40733:11;::::0;:28:::1;::::0;;-1:-1:-1;;;40733:28:0;;::::1;::::0;::::1;::::0;;;;;40673:35;;-1:-1:-1;40719:11:0::1;::::0;-1:-1:-1;;;;;40733:11:0;;::::1;::::0;:17:::1;::::0;:28;;;;;::::1;::::0;;;;;;;;;40719:11;40733;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40733:28:0;;-1:-1:-1;40780:14:0;;::::1;;40772:39;;;::::0;;-1:-1:-1;;;40772:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40772:39:0;;;;;;;;;;;;;::::1;;40829:22;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25732:1;;40513:346:::0;;:::o;37426:304::-;25631:8;;-1:-1:-1;;;;;25631:8:0;25617:10;:22;;:45;;-1:-1:-1;25657:5:0;;-1:-1:-1;;;;;25657:5:0;25643:10;:19;25617:45;:71;;;-1:-1:-1;25677:10:0;25666:22;;;;:10;:22;;;;;;;;25617:71;25595:126;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;-1:-1:-1;;;25595:126:0;;;;;;;;;;;;;;;37530:1:::1;37520:7;:11;37512:35;;;::::0;;-1:-1:-1;;;37512:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37512:35:0;;;;;;;;;;;;;::::1;;37576:11;::::0;:27:::1;::::0;;-1:-1:-1;;;37576:27:0;;::::1;::::0;::::1;::::0;;;;;37560:13:::1;::::0;-1:-1:-1;;;;;37576:11:0::1;::::0;:18:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;37560:13;37576:11;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37576:27:0;;-1:-1:-1;37622:16:0;;::::1;;37614:43;;;::::0;;-1:-1:-1;;;37614:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37614:43:0;;;;;;;;;;;;;::::1;;37670:10;:8;:10::i;:::-;37696:26;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25732:1;37426:304:::0;;:::o;27334:280::-;25489:8;;-1:-1:-1;;;;;25489:8:0;25475:10;:22;;:45;;-1:-1:-1;25515:5:0;;-1:-1:-1;;;;;25515:5:0;25501:10;:19;25475:45;25467:63;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;-1:-1:-1;;;25467:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27489:23:0;::::1;27481:56;;;::::0;;-1:-1:-1;;;27481:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27481:56:0;;;;;;;;;;;;;::::1;;27548:8;:20:::0;;-1:-1:-1;;;;;27548:20:0;::::1;-1:-1:-1::0;;;;;;27548:20:0;;::::1;::::0;::::1;::::0;;;27584:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;27334:280:::0;:::o;24151:20::-;;;-1:-1:-1;;;;;24151:20:0;;:::o;24348:29::-;;;:::o;13634:704::-;14049:10;;;14048:62;;-1:-1:-1;14065:39:0;;;-1:-1:-1;;;14065:39:0;;14089:4;14065:39;;;;-1:-1:-1;;;;;14065:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14065:39:0;:44;14048:62;14026:166;;;;-1:-1:-1;;;14026:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14257:62;;;-1:-1:-1;;;;;14257:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14257:62:0;-1:-1:-1;;;14257:62:0;;;14203:127;;14237:5;;14203:19;:127::i;3711:229::-;3848:12;3880:52;3902:6;3910:4;3916:1;3919:12;3880:21;:52::i;:::-;3873:59;;3711:229;;;;;;:::o;12830:245::-;12998:58;;;-1:-1:-1;;;;;12998:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12998:58:0;-1:-1:-1;;;12998:58:0;;;12944:123;;12978:5;;12944:19;:123::i;35769:813::-;36198:31;;;-1:-1:-1;;;36198:31:0;;36223:4;36198:31;;;;;;35815:10;;;;32647:42;;36198:16;;:31;;;;;;;;;;;;;;32647:42;36198:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36198:31:0;36466:30;;;-1:-1:-1;;;36466:30:0;;;;36198:31;;-1:-1:-1;36507:4:0;36501:3;:10;;36456:41;;33027:42;;36466:28;;:30;;;;;36198:31;;36466:30;;;;;;;;33027:42;36466:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36466:30:0;36456:5;;:9;:41::i;:::-;:56;;;;;;36448:64;;36533:41;36543:5;-1:-1:-1;;;;;36543:15:0;;36567:4;36543:30;;;;;;;;;;;;;-1:-1:-1;;;;;36543:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36543:30:0;36533:5;;:9;:41::i;:::-;36525:49;;35769:813;;:::o;41471:1003::-;41610:9;41622:5;-1:-1:-1;;;;;41622:15:0;;41646:4;41622:30;;;;;;;;;;;;;-1:-1:-1;;;;;41622:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41622:30:0;41719:17;;41687:50;;;-1:-1:-1;;;41687:50:0;;41712:4;41687:50;;;;41719:17;;;;41687:50;;;;;;;41622:30;;-1:-1:-1;32647:42:0;;41687:16;;:50;;;;;41622:30;;41687:50;;;;;;;;41719:17;32647:42;41687:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41687:50:0;41665:117;;;;;-1:-1:-1;;;41665:117:0;;;;;;;;;;;;-1:-1:-1;;;41665:117:0;;;;;;;;;;;;;;;41800:6;41795:246;31998:1;41812;:15;41795:246;;;41849:14;41873:7;41881:1;41873:10;;;;;;;;;41866:43;;;-1:-1:-1;;;41866:43:0;;41903:4;41866:43;;;;;;-1:-1:-1;;;;;41873:10:0;;;;41866:28;;:43;;;;;;;;;;;;;;;41873:10;41866:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41866:43:0;;-1:-1:-1;41928:13:0;;41924:106;;41962:52;41968:3;41972:1;41968:6;;;;;;;;;-1:-1:-1;;;;;41968:6:0;41976:7;41984:1;41976:10;;;;;;;;;-1:-1:-1;;;;;41976:10:0;41996:5;42004:9;41962:5;:52::i;:::-;-1:-1:-1;41829:3:0;;41795:246;;;;42093:4;42060:5;-1:-1:-1;;;;;42060:15:0;;42084:4;42060:30;;;;;;;;;;;;;-1:-1:-1;;;;;42060:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42060:30:0;:37;;-1:-1:-1;42116:18:0;;;;42108:43;;;;;-1:-1:-1;;;42108:43:0;;;;;;;;;;;;-1:-1:-1;;;42108:43:0;;;;;;;;;;;;;;;42217:8;;42213:218;;42242:8;24618:5;42253:17;42262:7;;42253:4;:8;;:17;;;;:::i;:::-;:32;;;;;;;-1:-1:-1;42304:7:0;;42300:120;;42351:8;;42332:33;;-1:-1:-1;;;;;42332:5:0;:18;;;42351:8;42361:3;42332:18;:33::i;:::-;42391:13;:4;42400:3;42391:8;:13::i;:::-;42384:20;;42300:120;42213:218;;42448:18;;;;;;;;;;;;;;;;;41471:1003;;:::o;13083:282::-;13278:68;;;-1:-1:-1;;;;;13278:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13278:68:0;-1:-1:-1;;;13278:68:0;;;13224:133;;13258:5;;13224:19;:133::i;:::-;13083:282;;;;:::o;42606:344::-;42642:10;42655:14;:12;:14::i;:::-;42692:11;;:34;;;-1:-1:-1;;;42692:34:0;;42720:4;42692:34;;;;;;42642:27;;-1:-1:-1;42680:9:0;;-1:-1:-1;;;;;42692:11:0;;;;:19;;:34;;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42692:34:0;;-1:-1:-1;42745:12:0;;;42737:38;;;;;-1:-1:-1;;;42737:38:0;;;;;;;;;;;;-1:-1:-1;;;42737:38:0;;;;;;;;;;;;;;;42802:12;;;42882:17;42802:12;42882:9;:17::i;:::-;42917:25;;;;;;;;;;;;;;;;;;;;42873:26;;-1:-1:-1;42917:25:0;;;;;;;;;;42606:344;;;:::o;43041:767::-;43109:10;43122:14;:12;:14::i;:::-;43109:27;;43164:9;43155:5;:18;;43147:42;;;;;-1:-1:-1;;;43147:42:0;;;;;;;;;;;;-1:-1:-1;;;43147:42:0;;;;;;;;;;;;;;;43217:9;43208:5;:18;;43200:42;;;;;-1:-1:-1;;;43200:42:0;;;;;;;;;;;;-1:-1:-1;;;43200:42:0;;;;;;;;;;;;;;;43359:11;;:34;;;-1:-1:-1;;;43359:34:0;;43387:4;43359:34;;;;;;43255:9;;;;;;;;-1:-1:-1;;;;;43359:11:0;;:19;;:34;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43359:34:0;;-1:-1:-1;43408:12:0;;;43404:247;;;43480:30;;;-1:-1:-1;;;43480:30:0;;43504:4;43480:30;;;;;;43444:12;;;;-1:-1:-1;;;;;;43480:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43480:30:0;;-1:-1:-1;43529:11:0;;;43525:63;;;43568:4;43561:11;;43525:63;43404:247;;;43634:5;43627:4;:12;43620:19;;43404:247;43674:1;43667:4;:8;:20;;;;43686:1;43679:4;:8;43667:20;43663:83;;;43704:11;;:30;;;-1:-1:-1;;;43704:30:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43704:11:0;;;;:18;;:30;;;;;:11;;:30;;;;;;;;:11;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43663:83;43763:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43041:767;;;;;;;:::o;38491:1422::-;38541:4;38558:8;38569:5;-1:-1:-1;;;;;38569:15:0;;38593:4;38569:30;;;;;;;;;;;;;-1:-1:-1;;;;;38569:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38569:30:0;;-1:-1:-1;38614:14:0;;;38610:61;;38652:7;38645:14;;;;;38610:61;38683:10;38696:14;:12;:14::i;:::-;38683:27;;38738:5;38727:7;:16;38723:64;;38770:5;38760:15;;38723:64;38854:31;;;-1:-1:-1;;;38854:31:0;;38879:4;38854:31;;;;;;38811:13;;;;38799:9;;32647:42;;38854:16;;:31;;;;;;;;;;;;;;32647:42;38854:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38854:31:0;;-1:-1:-1;38938:11:0;38952:53;38974:4;38980:11;;;38854:31;38952:21;:53::i;:::-;38938:67;-1:-1:-1;39055:10:0;;39051:150;;32647:42;-1:-1:-1;;;;;39123:24:0;;39148:6;39156:5;39123:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39123:39:0;39115:74;;;;;-1:-1:-1;;;39115:74:0;;;;;;;;;;;;-1:-1:-1;;;39115:74:0;;;;;;;;;;;;;;;39258:33;;;-1:-1:-1;;;39258:33:0;;39285:4;39258:33;;;;;;39245:10;;33174:42;;39258:18;;:33;;;;;;;;;;;;;;;33174:42;39258:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39258:33:0;;-1:-1:-1;39306:14:0;;;39302:61;;;39346:5;39337:14;;39302:61;39379:10;;39375:162;;39406:8;33337:5;39417:25;39437:4;;33337:5;39426:15;39417:4;:8;;:25;;;;:::i;:::-;:36;;;;;;39406:47;;32857:42;-1:-1:-1;;;;;39468:29:0;;39498:6;39513:5;39521:3;39468:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39375:162:0;39549:13;39565:5;-1:-1:-1;;;;;39565:15:0;;39589:4;39565:30;;;;;;;;;;;;;-1:-1:-1;;;;;39565:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39565:30:0;;-1:-1:-1;39610:18:0;;;39606:66;;;39652:8;-1:-1:-1;39645:15:0;;-1:-1:-1;;;;;;39645:15:0;39606:66;39795:5;39784:7;:16;39780:64;;39824:8;-1:-1:-1;39817:15:0;;-1:-1:-1;;;;;;39817:15:0;39780:64;39898:7;39891:14;;;;;;;;;38491:1422;;;;:::o;34791:340::-;34850:13;34873:7;34881:2;34873:11;;;;;;;;;-1:-1:-1;;;;;34873:11:0;;-1:-1:-1;34873:11:0;34936:3;34940:2;34936:7;;;;;;;;;-1:-1:-1;;;;;34936:7:0;:21;34932:84;;34974:30;34993:3;34997:2;34993:7;;;;;;;;;-1:-1:-1;;;;;34974:18:0;;;;34993:7;;34974:18;:30::i;:::-;35038:4;35028:3;35032:2;35028:7;;;;;;;;:14;;-1:-1:-1;;;;;;35028:14:0;-1:-1:-1;;;;;35028:14:0;;;;;;35083:40;;:18;;35102:4;-1:-1:-1;;35083:18:0;:40::i;36699:719::-;36738:8;36749:5;-1:-1:-1;;;;;36749:15:0;;36773:4;36749:30;;;;;;;;;;;;;-1:-1:-1;;;;;36749:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36749:30:0;;-1:-1:-1;36794:7:0;;36790:450;;36818:22;;:::i;:::-;36872:3;36855:7;36863:5;36855:14;;;;;;;;;;:20;;;;;36995:18;33027:42;-1:-1:-1;;;;;37016:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37016:30:0;;-1:-1:-1;37061:11:0;37075:41;37016:30;37075:22;37092:4;37075:12;:3;37083;37075:7;:12::i;:::-;:16;;:22::i;:::-;:26;;:41::i;:::-;37061:55;;37131:8;33337:5;37142:27;37164:4;;33337:5;37153:15;37142:6;:10;;:27;;;;:::i;:::-;:38;;;;;37197:31;;-1:-1:-1;;;37197:31:0;;37142:38;;;;-1:-1:-1;32857:42:0;;37197:17;;37215:7;;37142:38;;37197:31;;;37215:7;37197:31;;;37215:7;37197:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36790:450:0;37265:33;;;-1:-1:-1;;;37265:33:0;;37292:4;37265:33;;;;;;37252:10;;33174:42;;37265:18;;:33;;;;;;;;;;;;;;;33174:42;37265:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37265:33:0;;-1:-1:-1;37313:9:0;;37309:102;;37347:33;;;-1:-1:-1;;;37347:33:0;;32573:2;37347:33;;;;;;;;;;37375:4;37347:33;;;;;;32479:42;;37347:15;;:33;;;;;;;;;;;;;;-1:-1:-1;32479:42:0;37347:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37347:33:0;37339:60;;;;;-1:-1:-1;;;37339:60:0;;;;;;;;;;;;-1:-1:-1;;;37339:60:0;;;;;;;;;;;;;;15529:860;15953:23;15979:106;16021:4;15979:106;;;;;;;;;;;;;;;;;15987:5;-1:-1:-1;;;;;15979:27:0;;;:106;;;;;:::i;:::-;16100:17;;15953:132;;-1:-1:-1;16100:21:0;16096:286;;16273:10;16262:30;;;;;;;;;;;;;;;-1:-1:-1;16262:30:0;16236:134;;;;-1:-1:-1;;;16236:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4924:605;5091:12;5163:5;5138:21;:30;;5116:118;;;;-1:-1:-1;;;5116:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5253:18;5264:6;5253:10;:18::i;:::-;5245:60;;;;;-1:-1:-1;;;5245:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5379:12;5393:23;5420:6;-1:-1:-1;;;;;5420:11:0;5439:5;5446:4;5420:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5420:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5378:73;;;;5469:52;5487:7;5496:10;5508:12;5469:17;:52::i;:::-;5462:59;4924:605;-1:-1:-1;;;;;;;4924:605:0:o;19330:208::-;19382:4;19403:6;19399:20;;-1:-1:-1;19418:1:0;19411:8;;19399:20;19439:5;;;19443:1;19439;:5;:1;19463:5;;;;;:10;19455:56;;;;-1:-1:-1;;;19455:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19529:1;-1:-1:-1;19330:208:0;;;;;:::o;18472:167::-;18524:4;18550:5;;;18574:6;;;;18566:46;;;;;-1:-1:-1;;;18566:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;40955:508;41170:16;;;41184:1;41170:16;;;;;;;;;41146:21;;41170:16;;;;;;;;;;-1:-1:-1;41170:16:0;41146:40;;41207:8;41197:4;41202:1;41197:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;41197:18:0;;;-1:-1:-1;;;;;41197:18:0;;;;;31913:42;41226:4;41231:1;41226:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;41226:14:0;;;-1:-1:-1;;;;;41226:14:0;;;;;41261:9;41251:4;41256:1;41251:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;41251:19:0;;;-1:-1:-1;;;;;41251:19:0;;;;;41299:4;-1:-1:-1;;;;;41283:46:0;;41344:7;41366:1;41382:4;41409;41429:15;41283:172;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41283:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41283:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41283:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40955:508;;;;;:::o;18922:149::-;18974:4;19004:1;18999;:6;;18991:49;;;;;-1:-1:-1;;;18991:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19058:5:0;;;18922:149::o;37738:745::-;37871:4;38211:10;;38207:250;;38328:6;38317:7;:17;38313:77;;-1:-1:-1;38362:12:0;38355:19;;38313:77;38439:6;38411:25;:7;38423:12;38411:11;:25::i;:::-;:34;;;;;;38404:41;;;;38207:250;-1:-1:-1;38474:1:0;37738:745;;;;;:::o;20016:144::-;20068:4;20097:1;20093;:5;20085:44;;;;;-1:-1:-1;;;20085:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20151:1;20147;:5;;;;;;;20016:144;-1:-1:-1;;;20016:144:0:o;754:441::-;1131:20;1179:8;;;754:441::o;7754:777::-;7904:12;7933:7;7929:595;;;-1:-1:-1;7964:10:0;7957:17;;7929:595;8078:17;;:21;8074:439;;8341:10;8335:17;8402:15;8389:10;8385:2;8381:19;8374:44;8289:148;8484:12;8477:20;;-1:-1:-1;;;8477:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://da7f1492f62a935bee96b3e80c210601bcdfa9f84dd22c24ff331b4f443a47ed

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.