ETH Price: $2,685.48 (-3.22%)
Gas: 0.78 Gwei

Contract

0xbac5f0964006BD3871189dC0Da01E67d7C435C9F
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Repay131245162021-08-30 3:45:381265 days ago1630295138IN
0xbac5f096...d7C435C9F
0 ETH0.0677321683.818844
Deposit131176292021-08-29 2:14:171266 days ago1630203257IN
0xbac5f096...d7C435C9F
0 ETH0.0500609679.64858349
Report131175042021-08-29 1:44:151266 days ago1630201455IN
0xbac5f096...d7C435C9F
0 ETH0.01050395100.02242522
Claim Rewards131174892021-08-29 1:41:141266 days ago1630201274IN
0xbac5f096...d7C435C9F
0 ETH0.0288808195.46587335
Deposit131048392021-08-27 2:36:471268 days ago1630031807IN
0xbac5f096...d7C435C9F
0 ETH0.025190965.72267065
Report131047382021-08-27 2:13:111268 days ago1630030391IN
0xbac5f096...d7C435C9F
0 ETH0.0059937257.07436744
Claim Rewards131047102021-08-27 2:08:521268 days ago1630030132IN
0xbac5f096...d7C435C9F
0 ETH0.0168037655.54505747
Deposit130854082021-08-24 2:40:461271 days ago1629772846IN
0xbac5f096...d7C435C9F
0 ETH0.0471239474.40743834
Report130853022021-08-24 2:20:291271 days ago1629771629IN
0xbac5f096...d7C435C9F
0 ETH0.0074687271.11987725
Claim Rewards130852642021-08-24 2:13:491271 days ago1629771229IN
0xbac5f096...d7C435C9F
0 ETH0.0270581789.44113323
Deposit130524492021-08-19 0:33:351276 days ago1629333215IN
0xbac5f096...d7C435C9F
0 ETH0.0109537428.57992513
Report130522742021-08-18 23:55:161276 days ago1629330916IN
0xbac5f096...d7C435C9F
0 ETH0.0037128335.35494891
Claim Rewards130522582021-08-18 23:52:021276 days ago1629330722IN
0xbac5f096...d7C435C9F
0 ETH0.0107329737.34963556
Report130475572021-08-18 6:12:131277 days ago1629267133IN
0xbac5f096...d7C435C9F
0 ETH0.0029477428.06947847
Claim Rewards130475422021-08-18 6:08:551277 days ago1629266935IN
0xbac5f096...d7C435C9F
0 ETH0.0079263126.20572565
Deposit130474072021-08-18 5:37:451277 days ago1629265065IN
0xbac5f096...d7C435C9F
0 ETH0.0099256425.89585214
Report130330902021-08-16 0:45:531279 days ago1629074753IN
0xbac5f096...d7C435C9F
0 ETH0.0053174352.8
Claim Rewards130330712021-08-16 0:41:231279 days ago1629074483IN
0xbac5f096...d7C435C9F
0 ETH0.014003146.6524558
Deposit130149342021-08-13 5:35:051282 days ago1628832905IN
0xbac5f096...d7C435C9F
0 ETH0.0306190933.16932297
Set Admin130025742021-08-11 7:36:041284 days ago1628667364IN
0xbac5f096...d7C435C9F
0 ETH0.0016272254.08575054
Set Next Time Lo...130025712021-08-11 7:35:531284 days ago1628667353IN
0xbac5f096...d7C435C9F
0 ETH0.0025445154.08575054

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StrategyCompLevDai

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-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 CErc20 {
    function mint(uint mintAmount) external returns (uint);

    function redeemUnderlying(uint redeemAmount) external returns (uint);

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

    function repayBorrow(uint repayAmount) external returns (uint);

    function redeem(uint) external returns (uint);

    function borrowBalanceCurrent(address account) external returns (uint);

    function balanceOfUnderlying(address account) external returns (uint);

    function getAccountSnapshot(address account)
        external
        view
        returns (
            uint,
            uint,
            uint,
            uint
        );
}

interface Comptroller {
    function markets(address cToken)
        external
        view
        returns (
            bool,
            uint,
            bool
        );

    // Claim all the COMP accrued by holder in specific markets
    function claimComp(address holder, address[] calldata cTokens) external;
}

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;
    }
}

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 StrategyCompLev is Strategy {
    using SafeERC20 for IERC20;
    using SafeMath for uint;

    // Uniswap and Sushiswap //
    // UNISWAP = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    // SUSHISWAP = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F;
    address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public dex;

    // Compound //
    Comptroller private constant comptroller =
        Comptroller(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B);
    IERC20 private constant comp = IERC20(0xc00e94Cb662C3520282E6f5717214004A7f26888);
    CErc20 private immutable cToken;
    uint public buffer = 0.04 * 1e18;

    constructor(
        address _token,
        address _fundManager,
        address _treasury,
        address _cToken
    ) Strategy(_token, _fundManager, _treasury) {
        require(_cToken != address(0), "cToken = zero address");
        cToken = CErc20(_cToken);
        IERC20(_token).safeApprove(_cToken, type(uint).max);

        _setDex(0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // Sushiswap
    }

    function _setDex(address _dex) private {
        if (dex != address(0)) {
            comp.safeApprove(dex, 0);
        }

        dex = _dex;

        comp.safeApprove(_dex, type(uint).max);
    }

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

    function _totalAssets() private view returns (uint total) {
        // WARNING: This returns balance last time someone transacted with cToken
        (uint error, uint cTokenBal, uint borrowed, uint exchangeRate) = cToken
        .getAccountSnapshot(address(this));

        if (error > 0) {
            // something is wrong, return 0
            return 0;
        }
        uint supplied = cTokenBal.mul(exchangeRate) / 1e18;
        if (supplied < borrowed) {
            // something is wrong, return 0
            return 0;
        }
        total = token.balanceOf(address(this)).add(supplied - borrowed);
    }

    /*
    @notice Returns amount of tokens locked in this contract
    */
    function totalAssets() external view override returns (uint) {
        return _totalAssets();
    }

    /*
    @dev buffer = 0 means safe collateral ratio = market collateral ratio
         buffer = 1e18 means safe collateral ratio = 0
    */
    function setBuffer(uint _buffer) external onlyAuthorized {
        require(_buffer > 0 && _buffer <= 1e18, "buffer");
        buffer = _buffer;
    }

    function _getMarketCollateralRatio() private view returns (uint) {
        /*
        This can be changed by Compound Governance, with a minimum waiting
        period of five days
        */
        (, uint col, ) = comptroller.markets(address(cToken));
        return col;
    }

    function _getSafeCollateralRatio(uint _marketCol) private view returns (uint) {
        if (_marketCol > buffer) {
            return _marketCol - buffer;
        }
        return 0;
    }

    // Not view function
    function _getSupplied() private returns (uint) {
        return cToken.balanceOfUnderlying(address(this));
    }

    // Not view function
    function _getBorrowed() private returns (uint) {
        return cToken.borrowBalanceCurrent(address(this));
    }

    // Not view function. Call using static call from web3
    function getLivePosition()
        external
        returns (
            uint supplied,
            uint borrowed,
            uint marketCol,
            uint safeCol
        )
    {
        supplied = _getSupplied();
        borrowed = _getBorrowed();
        marketCol = _getMarketCollateralRatio();
        safeCol = _getSafeCollateralRatio(marketCol);
    }

    // @dev This returns balance last time someone transacted with cToken
    function getCachedPosition()
        external
        view
        returns (
            uint supplied,
            uint borrowed,
            uint marketCol,
            uint safeCol
        )
    {
        // ignore first output, which is error code
        (, uint cTokenBal, uint _borrowed, uint exchangeRate) = cToken
        .getAccountSnapshot(address(this));
        supplied = cTokenBal.mul(exchangeRate) / 1e18;
        borrowed = _borrowed;
        marketCol = _getMarketCollateralRatio();
        safeCol = _getSafeCollateralRatio(marketCol);
    }

    // @dev This modifier checks collateral ratio after leverage or deleverage
    modifier checkCollateralRatio() {
        _;
        uint supplied = _getSupplied();
        uint borrowed = _getBorrowed();
        uint marketCol = _getMarketCollateralRatio();
        uint safeCol = _getSafeCollateralRatio(marketCol);
        // borrowed / supplied <= safe col
        // supplied can = 0 so we check borrowed <= supplied * safe col
        // max borrow
        uint max = supplied.mul(safeCol) / 1e18;
        require(borrowed <= max, "borrowed > max");
    }

    // @dev In case infinite approval is reduced so that strategy cannot function
    function approve(uint _amount) external onlyAuthorized {
        token.safeApprove(address(cToken), _amount);
    }

    function _supply(uint _amount) private {
        require(cToken.mint(_amount) == 0, "mint");
    }

    // @dev Execute manual recovery by admin
    // @dev `_amount` must be >= balance of token
    function supplyManual(uint _amount) external onlyAuthorized {
        _supply(_amount);
    }

    function _borrow(uint _amount) private {
        require(cToken.borrow(_amount) == 0, "borrow");
    }

    // @dev Execute manual recovery by admin
    function borrowManual(uint _amount) external onlyAuthorized {
        _borrow(_amount);
    }

    function _repay(uint _amount) private {
        require(cToken.repayBorrow(_amount) == 0, "repay");
    }

    // @dev Execute manual recovery by admin
    // @dev `_amount` must be >= balance of token
    function repayManual(uint _amount) external onlyAuthorized {
        _repay(_amount);
    }

    function _redeem(uint _amount) private {
        require(cToken.redeemUnderlying(_amount) == 0, "redeem");
    }

    // @dev Execute manual recovery by admin
    function redeemManual(uint _amount) external onlyAuthorized {
        _redeem(_amount);
    }

    function _getMaxLeverageRatio(uint _col) private pure returns (uint) {
        /*
        c = collateral ratio
        geometric series converges to
            1 / (1 - c)
        */
        // multiplied by 1e18
        return uint(1e36).div(uint(1e18).sub(_col));
    }

    function _getBorrowAmount(
        uint _supplied,
        uint _borrowed,
        uint _col
    ) private pure returns (uint) {
        /*
        c = collateral ratio
        s = supplied
        b = borrowed
        x = amount to borrow
        (b + x) / s <= c
        becomes
        x <= sc - b
        */
        // max borrow
        uint max = _supplied.mul(_col) / 1e18;
        if (_borrowed >= max) {
            return 0;
        }
        return max - _borrowed;
    }

    /*
    Find total supply S_n after n iterations starting with
    S_0 supplied and B_0 borrowed
    c = collateral ratio
    S_i = supplied after i iterations
    B_i = borrowed after i iterations
    S_0 = current supplied
    B_0 = current borrowed
    borrowed and supplied after n iterations
        B_n = cS_(n-1)
        S_n = S_(n-1) + (cS_(n-1) - B_(n-1))
    you can prove using algebra and induction that
        B_n / S_n <= c
        S_n - S_(n-1) = c^(n-1) * (cS_0 - B_0)
        S_n = S_0 + sum (c^i * (cS_0 - B_0)), 0 <= i <= n - 1
            = S_0 + (1 - c^n) / (1 - c)
        S_n <= S_0 + (cS_0 - B_0) / (1 - c)
    */
    function _leverage(uint _targetSupply) private checkCollateralRatio {
        // buffer = 1e18 means safe collateral ratio = 0
        if (buffer >= 1e18) {
            return;
        }
        uint supplied = _getSupplied();
        uint borrowed = _getBorrowed();
        uint unleveraged = supplied.sub(borrowed); // supply with 0 leverage
        require(_targetSupply >= supplied, "leverage");
        uint marketCol = _getMarketCollateralRatio();
        uint safeCol = _getSafeCollateralRatio(marketCol);
        uint lev = _getMaxLeverageRatio(safeCol);
        // 99% to be safe, and save gas
        uint max = (unleveraged.mul(lev) / 1e18).mul(9900) / 10000;
        if (_targetSupply >= max) {
            _targetSupply = max;
        }
        uint i;
        while (supplied < _targetSupply) {
            // target is usually reached in 9 iterations
            require(i < 25, "max iteration");
            // use market collateral to calculate borrow amount
            // this is done so that supplied can reach _targetSupply
            // 99.99% is borrowed to be safe
            uint borrowAmount = _getBorrowAmount(supplied, borrowed, marketCol).mul(
                9999
            ) / 10000;
            require(borrowAmount > 0, "borrow = 0");
            if (supplied.add(borrowAmount) > _targetSupply) {
                // borrow > 0 since supplied < _targetSupply
                borrowAmount = _targetSupply.sub(supplied);
            }
            _borrow(borrowAmount);
            // end loop with _supply, this ensures no borrowed amount is unutilized
            _supply(borrowAmount);
            // supplied > _getSupplied(), by about 3 * 1e12 %, but we use local variable to save gas
            supplied = supplied.add(borrowAmount);
            // _getBorrowed == borrowed
            borrowed = borrowed.add(borrowAmount);
            i++;
        }
    }

    function leverage(uint _targetSupply) external onlyAuthorized {
        _leverage(_targetSupply);
    }

    function _deposit() private {
        uint bal = token.balanceOf(address(this));
        if (bal > 0) {
            _supply(bal);
            // leverage to max
            _leverage(type(uint).max);
        }
    }

    /*
    @notice Deposit token into this strategy
    @param _amount Amount of token to deposit
    @param _min Minimum amount to borrow from fund manager
    */
    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 _getRedeemAmount(
        uint _supplied,
        uint _borrowed,
        uint _col
    ) private pure returns (uint) {
        /*
        c = collateral ratio
        s = supplied
        b = borrowed
        r = redeem
        b / (s - r) <= c
        becomes
        r <= s - b / c
        */
        // min supply
        // b / c = min supply needed to borrow b
        uint min = _borrowed.mul(1e18).div(_col);
        if (_supplied <= min) {
            return 0;
        }
        return _supplied - min;
    }

    /*
    Find S_0, amount of supply with 0 leverage, after n iterations starting with
    S_n supplied and B_n borrowed
    c = collateral ratio
    S_n = current supplied
    B_n = current borrowed
    S_(n-i) = supplied after i iterations
    B_(n-i) = borrowed after i iterations
    R_(n-i) = Redeemable after i iterations
        = S_(n-i) - B_(n-i) / c
        where B_(n-i) / c = min supply needed to borrow B_(n-i)
    For 0 <= k <= n - 1
        S_k = S_(k+1) - R_(k+1)
        B_k = B_(k+1) - R_(k+1)
    and
        S_k - B_k = S_(k+1) - B_(k+1)
    so
        S_0 - B_0 = S_1 - S_2 = ... = S_n - B_n
    S_0 has 0 leverage so B_0 = 0 and we get
        S_0 = S_0 - B_0 = S_n - B_n
    ------------------------------------------
    Find S_(n-k), amount of supply, after k iterations starting with
    S_n supplied and B_n borrowed
    with algebra and induction you can derive that
    R_(n-k) = R_n / c^k
    S_(n-k) = S_n - sum R_(n-i), 0 <= i <= k - 1
            = S_n - R_n * ((1 - 1/c^k) / (1 - 1/c))
    Equation above is valid for S_(n - k) k < n
    */
    function _deleverage(uint _targetSupply) private checkCollateralRatio {
        uint supplied = _getSupplied();
        uint borrowed = _getBorrowed();
        uint unleveraged = supplied.sub(borrowed);
        require(_targetSupply <= supplied, "deleverage");
        uint marketCol = _getMarketCollateralRatio();
        // min supply
        if (_targetSupply <= unleveraged) {
            _targetSupply = unleveraged;
        }
        uint i;
        while (supplied > _targetSupply) {
            // target is usually reached in 8 iterations
            require(i < 25, "max iteration");
            // 99.99% to be safe
            uint redeemAmount = (_getRedeemAmount(supplied, borrowed, marketCol)).mul(
                9999
            ) / 10000;
            require(redeemAmount > 0, "redeem = 0");
            if (supplied.sub(redeemAmount) < _targetSupply) {
                // redeem > 0 since supplied > _targetSupply
                redeemAmount = supplied.sub(_targetSupply);
            }
            _redeem(redeemAmount);
            _repay(redeemAmount);
            // supplied < _geSupplied(), by about 7 * 1e12 %
            supplied = supplied.sub(redeemAmount);
            // borrowed == _getBorrowed()
            borrowed = borrowed.sub(redeemAmount);
            i++;
        }
    }

    function deleverage(uint _targetSupply) external onlyAuthorized {
        _deleverage(_targetSupply);
    }

    // @dev Returns amount available for transfer
    function _withdraw(uint _amount) private returns (uint) {
        uint bal = token.balanceOf(address(this));
        if (_amount <= bal) {
            return _amount;
        }

        uint redeemAmount = _amount - bal;
        /*
        c = collateral ratio
        s = supplied
        b = borrowed
        r = amount to redeem
        x = amount to repay
        where
            r <= s - b (can't redeem more than unleveraged supply)
        and
            x <= b (can't repay more than borrowed)
        and
            (b - x) / (s - x - r) <= c (stay below c after redeem and repay)
        so pick x such that
            (b - cs + cr) / (1 - c) <= x <= b
        when b <= cs left side of equation above <= cr / (1 - c) so pick x such that
            cr / (1 - c) <= x <= b
        */
        uint supplied = _getSupplied();
        uint borrowed = _getBorrowed();
        uint marketCol = _getMarketCollateralRatio();
        uint safeCol = _getSafeCollateralRatio(marketCol);
        uint unleveraged = supplied.sub(borrowed);
        // r <= s - b
        if (redeemAmount > unleveraged) {
            redeemAmount = unleveraged;
        }
        // cr / (1 - c) <= x <= b
        uint repayAmount = redeemAmount.mul(safeCol).div(uint(1e18).sub(safeCol));
        if (repayAmount > borrowed) {
            repayAmount = borrowed;
        }

        _deleverage(supplied.sub(repayAmount));
        _redeem(redeemAmount);

        uint balAfter = token.balanceOf(address(this));
        if (balAfter < _amount) {
            return balAfter;
        }
        return _amount;
    }

    /*
    @notice Withdraw undelying token to erc20Vault
    @param _amount Amount of token to withdraw
    @dev Returns current loss = debt to fund manager - total assets
    @dev Caller should implement guard against slippage
    */
    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 {
        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 _from,
        address _to,
        uint _amount
    ) private {
        // create dynamic array with 3 elements
        address[] memory path = new address[](3);
        path[0] = _from;
        path[1] = WETH;
        path[2] = _to;

        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));

        // claim COMP
        address[] memory cTokens = new address[](1);
        cTokens[0] = address(cToken);
        comptroller.claimComp(address(this), cTokens);

        uint compBal = comp.balanceOf(address(this));
        if (compBal > 0) {
            _swap(address(comp), address(token), compBal);
        }

        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;
        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 {
        require(_token != address(token), "protected token");
        require(_token != address(cToken), "protected token");
        require(_token != address(comp), "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 StrategyCompLevDai is StrategyCompLev {
    constructor(address _fundManager, address _treasury)
        StrategyCompLev(
            0x6B175474E89094C44Da98b954EedeAC495271d0F,
            _fundManager,
            _treasury,
            0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643
        )
    {}
}

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":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","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":"_amount","type":"uint256"}],"name":"borrowManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_targetSupply","type":"uint256"}],"name":"deleverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":[],"name":"getCachedPosition","outputs":[{"internalType":"uint256","name":"supplied","type":"uint256"},{"internalType":"uint256","name":"borrowed","type":"uint256"},{"internalType":"uint256","name":"marketCol","type":"uint256"},{"internalType":"uint256","name":"safeCol","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLivePosition","outputs":[{"internalType":"uint256","name":"supplied","type":"uint256"},{"internalType":"uint256","name":"borrowed","type":"uint256"},{"internalType":"uint256","name":"marketCol","type":"uint256"},{"internalType":"uint256","name":"safeCol","type":"uint256"}],"stateMutability":"nonpayable","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":"uint256","name":"_targetSupply","type":"uint256"}],"name":"leverage","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"}],"name":"redeemManual","outputs":[],"stateMutability":"nonpayable","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":"_amount","type":"uint256"}],"name":"repayManual","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":"uint256","name":"_buffer","type":"uint256"}],"name":"setBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_claimRewards","type":"bool"}],"name":"setClaimRewardsOnMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"supplyManual","outputs":[],"stateMutability":"nonpayable","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"}]

60c06040526103e86006556007805460ff19166001179055668e1bc9bf0400006008553480156200002f57600080fd5b5060405162004b0838038062004b08833981810160405260408110156200005557600080fd5b508051602090910151736b175474e89094c44da98b954eedeac495271d0f8282735d3a536e4d6dbd6114cc1ead35777bab948e36438383836001600160a01b038116620000e9576040805162461bcd60e51b815260206004820152601460248201527f7472656173757279203d20302061646472657373000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b031990811633908117909255600280548216909217909155600380546001600160a01b038481169190931617905560408051637e062a3560e11b815290518583169285169163fc0c546a916004808301926020929190829003018186803b1580156200015f57600080fd5b505afa15801562000174573d6000803e3d6000fd5b505050506040513d60208110156200018b57600080fd5b50516001600160a01b031614620001e9576040805162461bcd60e51b815260206004820152601b60248201527f66756e64206d616e6167657220746f6b656e20213d20746f6b656e0000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155606084901b6001600160601b0319166080526200023890841683600019620002f8602090811b620021f517901c565b5050506001600160a01b03811662000297576040805162461bcd60e51b815260206004820152601560248201527f63546f6b656e203d207a65726f20616464726573730000000000000000000000604482015290519081900360640190fd5b606081901b6001600160601b03191660a052620002cd6001600160a01b03851682600019620002f8602090811b620021f517901c565b620002ec73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f6200041c565b505050505050620007b3565b80158062000382575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200035257600080fd5b505afa15801562000367573d6000803e3d6000fd5b505050506040513d60208110156200037e57600080fd5b5051155b620003bf5760405162461bcd60e51b815260040180806020018281038252603681526020018062004ad26036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915262000417918591620004c516565b505050565b60075461010090046001600160a01b0316156200047357600754620004739073c00e94cb662c3520282e6f5717214004a7f268889061010090046001600160a01b03166000620002f8602090811b620021f517901c565b60078054610100600160a81b0319166101006001600160a01b03841602179055620004c273c00e94cb662c3520282e6f5717214004a7f2688882600019620002f8602090811b620021f517901c565b50565b600062000521826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200058160201b62002308179092919060201c565b80519091501562000417578080602001905160208110156200054257600080fd5b5051620004175760405162461bcd60e51b815260040180806020018281038252602a81526020018062004aa8602a913960400191505060405180910390fd5b60606200059284846000856200059c565b90505b9392505050565b606082471015620005df5760405162461bcd60e51b815260040180806020018281038252602681526020018062004a826026913960400191505060405180910390fd5b620005ea8562000703565b6200063c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106200067c5780518252601f1990920191602091820191016200065b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114620006e0576040519150601f19603f3d011682016040523d82523d6000602084013e620006e5565b606091505b509092509050620006f882828662000709565b979650505050505050565b3b151590565b606083156200071a57508162000595565b8251156200072b5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007775781810151838201526020016200075d565b50505050905090810190601f168015620007a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60805160601c60a05160601c6142146200086e600039806107a55280610a5e52806119a6528061237d52806125e95280612a1e528061312e52806131d0528061346a528061372f52806138b3528061398052508061072c5280610a255280610ce35280610d0f5280610e1d528061117652806119845280611a365280611c0752806121d3528061247f528061252a528061277c52806127a452806128c35280612d2f5280612e975280612fe152806137fe52506142146000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80637372bb4111610146578063b9181611116100c3578063edaafe2011610087578063edaafe201461063c578063ef5f380014610644578063f0f4426014610661578063f849521f14610687578063f851a440146106a4578063fc0c546a146106ac57610253565b8063b9181611146105a2578063ce5494bb146105c8578063d085835a146105ee578063d8aed145146105f6578063e2bbb1581461061957610253565b8063acd431a81161010a578063acd431a814610526578063adc7ea3714610543578063b06fca9614610560578063b127df871461057d578063b759f9541461058557610253565b80637372bb41146104a4578063753c0985146104c1578063775d35e5146104e45780639fdabec2146104ec578063ac0489261461050957610253565b80632d1fb389116101d457806347a02a441161019857806347a02a441461042457806361d027b31461044a5780636209ec2d1461046e578063692058c214610476578063704b6c021461047e57610253565b80632d1fb389146103785780632e1a7d4d146103a65780633739795c146103c357806342d14c83146103e2578063447fa8b7146103fe57610253565b80631dd19cb41161021b5780631dd19cb4146103115780631e39831e1461031957806322b2ba7314610321578063232a306014610329578063284fa3441461034f57610253565b806301681a621461025857806301e1d114146102805780630962ef791461029a5780630acf8481146102b75780631ada33a8146102e3575b600080fd5b61027e6004803603602081101561026e57600080fd5b50356001600160a01b03166106b4565b005b610288610913565b60408051918252519081900360200190f35b61027e600480360360208110156102b057600080fd5b5035610923565b61027e600480360360408110156102cd57600080fd5b506001600160a01b0381351690602001356109a2565b6102eb610a51565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61027e610b4a565b61027e610bca565b610288610c6f565b61027e6004803603602081101561033f57600080fd5b50356001600160a01b0316610c75565b61027e6004803603606081101561036557600080fd5b5080359060208101359060400135610e85565b61027e6004803603604081101561038e57600080fd5b506001600160a01b0381351690602001351515610f1b565b610288600480360360208110156103bc57600080fd5b5035611029565b61027e600480360360208110156103d957600080fd5b503515156111e5565b6103ea611254565b604080519115158252519081900360200190f35b61027e6004803603602081101561041457600080fd5b50356001600160a01b031661125d565b61027e6004803603602081101561043a57600080fd5b50356001600160a01b03166112ff565b61045261139f565b604080516001600160a01b039092168252519081900360200190f35b6104526113ae565b6104526113bd565b61027e6004803603602081101561049457600080fd5b50356001600160a01b03166113d1565b61027e600480360360208110156104ba57600080fd5b50356114d0565b61027e600480360360408110156104d757600080fd5b5080359060200135611574565b6102eb6115f4565b61027e6004803603602081101561050257600080fd5b5035611629565b61027e6004803603602081101561051f57600080fd5b50356116a8565b61027e6004803603602081101561053c57600080fd5b5035611727565b61027e6004803603602081101561055957600080fd5b50356117a6565b61027e6004803603602081101561057657600080fd5b5035611873565b6104526118f2565b61027e6004803603602081101561059b57600080fd5b5035611901565b6103ea600480360360208110156105b857600080fd5b50356001600160a01b03166119cb565b61027e600480360360208110156105de57600080fd5b50356001600160a01b03166119e0565b610452611c99565b61027e6004803603604081101561060c57600080fd5b5080359060200135611ca8565b61027e6004803603604081101561062f57600080fd5b5080359060200135611dfa565b610288611fbc565b61027e6004803603602081101561065a57600080fd5b5035611fc2565b61027e6004803603602081101561067757600080fd5b50356001600160a01b0316612041565b61027e6004803603602081101561069d57600080fd5b5035612143565b6104526121c2565b6104526121d1565b6000546001600160a01b03163314806106d757506002546001600160a01b031633145b806106f157503360009081526004602052604090205460ff165b61072a576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614156107a3576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561081c576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b6001600160a01b03811673c00e94cb662c3520282e6f5717214004a7f268881415610880576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b600254604080516370a0823160e01b81523060048201529051610910926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d60208110156108fd57600080fd5b50516001600160a01b0384169190612321565b50565b600061091d612373565b90505b90565b6000546001600160a01b031633148061094657506002546001600160a01b031633145b8061096057503360009081526004602052604090205460ff165b610999576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081612526565b6000546001600160a01b03163314806109c557506002546001600160a01b031633145b806109df57503360009081526004602052604090205460ff165b610a18576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a4d6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016833084612934565b5050565b60008060008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c37f68e2306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b158015610ac957600080fd5b505afa158015610add573d6000803e3d6000fd5b505050506040513d6080811015610af357600080fd5b50602081015160408201516060909201519094509092509050670de0b6b3a7640000610b1f8483612994565b81610b2657fe5b049650819550610b346129f6565b9450610b3f85612aaf565b935050505090919293565b6000546001600160a01b0316331480610b6d57506002546001600160a01b031633145b80610b8757503360009081526004602052604090205460ff165b610bc0576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610bc8612acf565b565b6001546001600160a01b03163314610c1b576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610cc1576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610d0d57600554610d0d906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911660006121f5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610df7576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610e46907f000000000000000000000000000000000000000000000000000000000000000016826000196121f5565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b6000546001600160a01b0316331480610ea857506002546001600160a01b031633145b80610ec257503360009081526004602052604090205460ff165b610efb576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610f0483612526565b610f0c612acf565b610f168282612bf1565b505050565b6000546001600160a01b0316331480610f3e57506002546001600160a01b031633145b610f77576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610fc5576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b0316331461107b576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b600082116110bf576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b60006110ca83612e92565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d602081101561114557600080fd5b505190506000611153612373565b9050808211156111635780820393505b821561119d5761119d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163385612321565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061120857506002546001600160a01b031633145b611241576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b60075460ff1681565b6000546001600160a01b031633146112a9576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166112f6576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b610910816130a1565b6000546001600160a01b0316331461134b576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b60075461010090046001600160a01b031681565b6000546001600160a01b03163314806113f457506002546001600160a01b031633145b61142d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661147c576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b03163314806114f357506002546001600160a01b031633145b61152c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d081111561156f576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b031633148061159757506002546001600160a01b031633145b806115b157503360009081526004602052604090205460ff165b6115ea576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a4d8282612bf1565b60008060008061160261312a565b935061160c6131cc565b92506116166129f6565b915061162182612aaf565b905090919293565b6000546001600160a01b031633148061164c57506002546001600160a01b031633145b8061166657503360009081526004602052604090205460ff165b61169f576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161323d565b6000546001600160a01b03163314806116cb57506002546001600160a01b031633145b806116e557503360009081526004602052604090205460ff165b61171e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081613468565b6000546001600160a01b031633148061174a57506002546001600160a01b031633145b8061176457503360009081526004602052604090205460ff165b61179d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081613534565b6000546001600160a01b03163314806117c957506002546001600160a01b031633145b806117e357503360009081526004602052604090205460ff165b61181c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000811180156118345750670de0b6b3a76400008111155b61186e576040805162461bcd60e51b8152602060048201526006602482015265313ab33332b960d11b604482015290519081900360640190fd5b600855565b6000546001600160a01b031633148061189657506002546001600160a01b031633145b806118b057503360009081526004602052604090205460ff165b6118e9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161372d565b6001546001600160a01b031681565b6000546001600160a01b031633148061192457506002546001600160a01b031633145b8061193e57503360009081526004602052604090205460ff165b611977576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109106001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000836121f5565b60046020526000908152604090205460ff1681565b6005546001600160a01b03163314611a2f576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9757600080fd5b505afa158015611aab573d6000803e3d6000fd5b505050506040513d6020811015611ac157600080fd5b50516001600160a01b031614611b1e576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b50516001600160a01b031614611bd65760405162461bcd60e51b81526004018080602001828103825260258152602001806141396025913960400191505060405180910390fd5b60075460ff1615611beb57611beb6001612526565b6000611bf8600019612e92565b9050611c2e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684836121f5565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b158015611c7c57600080fd5b505af1158015611c90573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b60008211611ce9576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b6000611cf483612e92565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b158015611d4757600080fd5b505af1158015611d5b573d6000803e3d6000fd5b505050506040513d6020811015611d7157600080fd5b5051905082811015611db9576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b0316331480611e1d57506002546001600160a01b031633145b80611e3757503360009081526004602052604090205460ff165b611e70576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611eb3576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611f0057600080fd5b505af1158015611f14573d6000803e3d6000fd5b505050506040513d6020811015611f2a57600080fd5b5051905081811015611f74576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611f7c6137fa565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b60085481565b6000546001600160a01b0316331480611fe557506002546001600160a01b031633145b80611fff57503360009081526004602052604090205460ff165b612038576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610910816138b1565b6000546001600160a01b031633148061206457506002546001600160a01b031633145b61209d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b0381166120ef576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6000546001600160a01b031633148061216657506002546001600160a01b031633145b8061218057503360009081526004602052604090205460ff165b6121b9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161397e565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b80158061227b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561224d57600080fd5b505afa158015612261573d6000803e3d6000fd5b505050506040513d602081101561227757600080fd5b5051155b6122b65760405162461bcd60e51b81526004018080602001828103825260368152602001806141a96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610f16908490613a4b565b60606123178484600085613afc565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f16908490613a4b565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c37f68e2306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b1580156123e857600080fd5b505afa1580156123fc573d6000803e3d6000fd5b505050506040513d608081101561241257600080fd5b50805160208201516040830151606090930151919650945090925090508315612442576000945050505050610920565b6000670de0b6b3a76400006124578584612994565b8161245e57fe5b0490508281101561247757600095505050505050610920565b61251c8382037f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b505190613c57565b9550505050505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561259557600080fd5b505afa1580156125a9573d6000803e3d6000fd5b505050506040513d60208110156125bf57600080fd5b505160408051600180825281830190925291925060009190602080830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061261557fe5b6001600160a01b039092166020928302919091018201526040805162e1ed9760e51b8152306004820181815260248301938452855160448401528551733d9819210a31b4961b30ef54be2aed79b9c9cd3b95631c3db2e0959394889492606490910191858101910280838360005b8381101561269b578181015183820152602001612683565b505050509050019350505050600060405180830381600087803b1580156126c157600080fd5b505af11580156126d5573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073c00e94cb662c3520282e6f5717214004a7f2688892506370a0823191602480820192602092909190829003018186803b15801561272e57600080fd5b505afa158015612742573d6000803e3d6000fd5b505050506040513d602081101561275857600080fd5b5051905080156127a1576127a173c00e94cb662c3520282e6f5717214004a7f268887f000000000000000000000000000000000000000000000000000000000000000083613cb1565b827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561280f57600080fd5b505afa158015612823573d6000803e3d6000fd5b505050506040513d602081101561283957600080fd5b505103925083831015612882576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b82156128fb5760006127106128a26006548661299490919063ffffffff16565b816128a957fe5b04905080156128f9576003546128ec906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612321565b6128f68482613f05565b93505b505b6040805184815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a150505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261298e908590613a4b565b50505050565b6000826129a3575060006129f0565b828202828482816129b057fe5b04146129ed5760405162461bcd60e51b815260040180806020018281038252602181526020018061415e6021913960400191505060405180910390fd5b90505b92915050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b6001600160a01b0316638e8f294b7f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060606040518083038186803b158015612a7a57600080fd5b505afa158015612a8e573d6000803e3d6000fd5b505050506040513d6060811015612aa457600080fd5b506020015191505090565b6000600854821115612ac657506008548103612aca565b5060005b919050565b6000612ad9612373565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015612b2a57600080fd5b505afa158015612b3e573d6000803e3d6000fd5b505050506040513d6020811015612b5457600080fd5b50519050808211612b9c576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b808203612ba881612e92565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612bfb612373565b905082811015612c40576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b81811115612c83576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b158015612cd457600080fd5b505afa158015612ce8573d6000803e3d6000fd5b505050506040513d6020811015612cfe57600080fd5b5051905080851115612db457604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d6020811015612d9f57600080fd5b5051915081841115612daf578193505b612dba565b84810392505b6000841180612dc95750600083115b15612e3b576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b158015612e2257600080fd5b505af1158015612e36573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f0257600080fd5b505afa158015612f16573d6000803e3d6000fd5b505050506040513d6020811015612f2c57600080fd5b50519050808311612f405782915050612aca565b8083036000612f4d61312a565b90506000612f596131cc565b90506000612f656129f6565b90506000612f7282612aaf565b90506000612f808585613f05565b905080861115612f8e578095505b6000612fb5612fa5670de0b6b3a764000085613f05565b612faf8986612994565b90613f62565b905084811115612fc25750835b612fd4612fcf8783613f05565b61323d565b612fdd876138b1565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561304c57600080fd5b505afa158015613060573d6000803e3d6000fd5b505050506040513d602081101561307657600080fd5b505190508a811015613092579850612aca975050505050505050565b50989998505050505050505050565b60075461010090046001600160a01b0316156130e9576007546130e99073c00e94cb662c3520282e6f5717214004a7f268889061010090046001600160a01b031660006121f5565b60078054610100600160a81b0319166101006001600160a01b0384160217905561091073c00e94cb662c3520282e6f5717214004a7f26888826000196121f5565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633af9e669306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561319b57600080fd5b505af11580156131af573d6000803e3d6000fd5b505050506040513d60208110156131c557600080fd5b5051905090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166317bfdfbc306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561319b57600080fd5b600061324761312a565b905060006132536131cc565b905060006132618383613f05565b9050828411156132a5576040805162461bcd60e51b815260206004820152600a60248201526964656c6576657261676560b01b604482015290519081900360640190fd5b60006132af6129f6565b90508185116132bc578194505b60005b858511156133c5576019811061330c576040805162461bcd60e51b815260206004820152600d60248201526c36b0bc1034ba32b930ba34b7b760991b604482015290519081900360640190fd5b600061271061332861270f613322898988613fc9565b90612994565b8161332f57fe5b04905060008111613374576040805162461bcd60e51b815260206004820152600a602482015269072656465656d203d20360b41b604482015290519081900360640190fd5b8661337f8783613f05565b10156133925761338f8688613f05565b90505b61339b816138b1565b6133a481613468565b6133ae8682613f05565b95506133ba8582613f05565b9450506001016132bf565b505050505060006133d461312a565b905060006133e06131cc565b905060006133ec6129f6565b905060006133f982612aaf565b90506000670de0b6b3a76400006134108684612994565b8161341757fe5b04905080841115613460576040805162461bcd60e51b815260206004820152600e60248201526d0c4dee4e4deeecac8407c40dac2f60931b604482015290519081900360640190fd5b505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156134ce57600080fd5b505af11580156134e2573d6000803e3d6000fd5b505050506040513d60208110156134f857600080fd5b505115610910576040805162461bcd60e51b8152602060048201526005602482015264726570617960d81b604482015290519081900360640190fd5b670de0b6b3a76400006008541061354a57613723565b600061355461312a565b905060006135606131cc565b9050600061356e8383613f05565b9050828410156135b0576040805162461bcd60e51b81526020600482015260086024820152676c6576657261676560c01b604482015290519081900360640190fd5b60006135ba6129f6565b905060006135c782612aaf565b905060006135d482613fff565b905060006127106136026126ac670de0b6b3a76400006135f48987612994565b816135fb57fe5b0490612994565b8161360957fe5b049050808810613617578097505b60005b8888101561371a5760198110613667576040805162461bcd60e51b815260206004820152600d60248201526c36b0bc1034ba32b930ba34b7b760991b604482015290519081900360640190fd5b600061271061367d61270f6133228c8c8b61402c565b8161368457fe5b049050600081116136c9576040805162461bcd60e51b815260206004820152600a6024820152690626f72726f77203d20360b41b604482015290519081900360640190fd5b896136d48a83613c57565b11156136e7576136e48a8a613f05565b90505b6136f08161397e565b6136f98161372d565b6137038982613c57565b985061370f8882613c57565b97505060010161361a565b50505050505050505b60006133d461312a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561379357600080fd5b505af11580156137a7573d6000803e3d6000fd5b505050506040513d60208110156137bd57600080fd5b505115610910576040805162461bcd60e51b815260206004808301919091526024820152631b5a5b9d60e21b604482015290519081900360640190fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561386957600080fd5b505afa15801561387d573d6000803e3d6000fd5b505050506040513d602081101561389357600080fd5b505190508015610910576138a68161372d565b610910600019613534565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561391757600080fd5b505af115801561392b573d6000803e3d6000fd5b505050506040513d602081101561394157600080fd5b505115610910576040805162461bcd60e51b815260206004820152600660248201526572656465656d60d01b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c5ebeaec826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156139e457600080fd5b505af11580156139f8573d6000803e3d6000fd5b505050506040513d6020811015613a0e57600080fd5b505115610910576040805162461bcd60e51b8152602060048201526006602482015265626f72726f7760d01b604482015290519081900360640190fd5b6000613aa0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123089092919063ffffffff16565b805190915015610f1657808060200190516020811015613abf57600080fd5b5051610f165760405162461bcd60e51b815260040180806020018281038252602a81526020018061417f602a913960400191505060405180910390fd5b606082471015613b3d5760405162461bcd60e51b81526004018080602001828103825260268152602001806141136026913960400191505060405180910390fd5b613b4685614068565b613b97576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310613bd55780518252601f199092019160209182019101613bb6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c37576040519150601f19603f3d011682016040523d82523d6000602084013e613c3c565b606091505b5091509150613c4c82828661406e565b979650505050505050565b6000828201838110156129ed576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60408051600380825260808201909252600091602082016060803683370190505090508381600081518110613ce257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613d2457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110613d5257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600760019054906101000a90046001600160a01b03166001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613e0c578181015183820152602001613df4565b505050509050019650505050505050600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613e7257600080fd5b8101908080516040519392919084640100000000821115613e9257600080fd5b908301906020820185811115613ea757600080fd5b8251866020820283011164010000000082111715613ec457600080fd5b82525081516020918201928201910280838360005b83811015613ef1578181015183820152602001613ed9565b505050509050016040525050505050505050565b600082821115613f5c576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808211613fb8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613fc157fe5b049392505050565b600080613fe283612faf86670de0b6b3a7640000612994565b9050808511613ff557600091505061231a565b9093039392505050565b60006129f0614016670de0b6b3a764000084613f05565b6ec097ce7bc90715b34b9f100000000090613f62565b600080670de0b6b3a76400006140428685612994565b8161404957fe5b04905080841061405d57600091505061231a565b929092039392505050565b3b151590565b6060831561407d57508161231a565b82511561408d5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140d75781810151838201526020016140bf565b50505050905090810190601f1680156141045780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220c7042af53e05c8f76669f283deb9a0ca42c63572e21052e14cf7ae999102895264736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000000007c765c474d231fd915dc78832b478f309071cba700000000000000000000000086d10751b18f3fe331c146546868a07224a8598b

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102535760003560e01c80637372bb4111610146578063b9181611116100c3578063edaafe2011610087578063edaafe201461063c578063ef5f380014610644578063f0f4426014610661578063f849521f14610687578063f851a440146106a4578063fc0c546a146106ac57610253565b8063b9181611146105a2578063ce5494bb146105c8578063d085835a146105ee578063d8aed145146105f6578063e2bbb1581461061957610253565b8063acd431a81161010a578063acd431a814610526578063adc7ea3714610543578063b06fca9614610560578063b127df871461057d578063b759f9541461058557610253565b80637372bb41146104a4578063753c0985146104c1578063775d35e5146104e45780639fdabec2146104ec578063ac0489261461050957610253565b80632d1fb389116101d457806347a02a441161019857806347a02a441461042457806361d027b31461044a5780636209ec2d1461046e578063692058c214610476578063704b6c021461047e57610253565b80632d1fb389146103785780632e1a7d4d146103a65780633739795c146103c357806342d14c83146103e2578063447fa8b7146103fe57610253565b80631dd19cb41161021b5780631dd19cb4146103115780631e39831e1461031957806322b2ba7314610321578063232a306014610329578063284fa3441461034f57610253565b806301681a621461025857806301e1d114146102805780630962ef791461029a5780630acf8481146102b75780631ada33a8146102e3575b600080fd5b61027e6004803603602081101561026e57600080fd5b50356001600160a01b03166106b4565b005b610288610913565b60408051918252519081900360200190f35b61027e600480360360208110156102b057600080fd5b5035610923565b61027e600480360360408110156102cd57600080fd5b506001600160a01b0381351690602001356109a2565b6102eb610a51565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61027e610b4a565b61027e610bca565b610288610c6f565b61027e6004803603602081101561033f57600080fd5b50356001600160a01b0316610c75565b61027e6004803603606081101561036557600080fd5b5080359060208101359060400135610e85565b61027e6004803603604081101561038e57600080fd5b506001600160a01b0381351690602001351515610f1b565b610288600480360360208110156103bc57600080fd5b5035611029565b61027e600480360360208110156103d957600080fd5b503515156111e5565b6103ea611254565b604080519115158252519081900360200190f35b61027e6004803603602081101561041457600080fd5b50356001600160a01b031661125d565b61027e6004803603602081101561043a57600080fd5b50356001600160a01b03166112ff565b61045261139f565b604080516001600160a01b039092168252519081900360200190f35b6104526113ae565b6104526113bd565b61027e6004803603602081101561049457600080fd5b50356001600160a01b03166113d1565b61027e600480360360208110156104ba57600080fd5b50356114d0565b61027e600480360360408110156104d757600080fd5b5080359060200135611574565b6102eb6115f4565b61027e6004803603602081101561050257600080fd5b5035611629565b61027e6004803603602081101561051f57600080fd5b50356116a8565b61027e6004803603602081101561053c57600080fd5b5035611727565b61027e6004803603602081101561055957600080fd5b50356117a6565b61027e6004803603602081101561057657600080fd5b5035611873565b6104526118f2565b61027e6004803603602081101561059b57600080fd5b5035611901565b6103ea600480360360208110156105b857600080fd5b50356001600160a01b03166119cb565b61027e600480360360208110156105de57600080fd5b50356001600160a01b03166119e0565b610452611c99565b61027e6004803603604081101561060c57600080fd5b5080359060200135611ca8565b61027e6004803603604081101561062f57600080fd5b5080359060200135611dfa565b610288611fbc565b61027e6004803603602081101561065a57600080fd5b5035611fc2565b61027e6004803603602081101561067757600080fd5b50356001600160a01b0316612041565b61027e6004803603602081101561069d57600080fd5b5035612143565b6104526121c2565b6104526121d1565b6000546001600160a01b03163314806106d757506002546001600160a01b031633145b806106f157503360009081526004602052604090205460ff165b61072a576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031614156107a3576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b0316816001600160a01b0316141561081c576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b6001600160a01b03811673c00e94cb662c3520282e6f5717214004a7f268881415610880576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b600254604080516370a0823160e01b81523060048201529051610910926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d60208110156108fd57600080fd5b50516001600160a01b0384169190612321565b50565b600061091d612373565b90505b90565b6000546001600160a01b031633148061094657506002546001600160a01b031633145b8061096057503360009081526004602052604090205460ff165b610999576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081612526565b6000546001600160a01b03163314806109c557506002546001600160a01b031633145b806109df57503360009081526004602052604090205460ff165b610a18576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a4d6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16833084612934565b5050565b60008060008060008060007f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663c37f68e2306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b158015610ac957600080fd5b505afa158015610add573d6000803e3d6000fd5b505050506040513d6080811015610af357600080fd5b50602081015160408201516060909201519094509092509050670de0b6b3a7640000610b1f8483612994565b81610b2657fe5b049650819550610b346129f6565b9450610b3f85612aaf565b935050505090919293565b6000546001600160a01b0316331480610b6d57506002546001600160a01b031633145b80610b8757503360009081526004602052604090205460ff165b610bc0576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610bc8612acf565b565b6001546001600160a01b03163314610c1b576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610cc1576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610d0d57600554610d0d906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8116911660006121f5565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610df7576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610e46907f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16826000196121f5565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b6000546001600160a01b0316331480610ea857506002546001600160a01b031633145b80610ec257503360009081526004602052604090205460ff165b610efb576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610f0483612526565b610f0c612acf565b610f168282612bf1565b505050565b6000546001600160a01b0316331480610f3e57506002546001600160a01b031633145b610f77576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610fc5576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b0316331461107b576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b600082116110bf576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b60006110ca83612e92565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d602081101561114557600080fd5b505190506000611153612373565b9050808211156111635780820393505b821561119d5761119d6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f163385612321565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061120857506002546001600160a01b031633145b611241576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b60075460ff1681565b6000546001600160a01b031633146112a9576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166112f6576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b610910816130a1565b6000546001600160a01b0316331461134b576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b60075461010090046001600160a01b031681565b6000546001600160a01b03163314806113f457506002546001600160a01b031633145b61142d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b03811661147c576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b03163314806114f357506002546001600160a01b031633145b61152c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d081111561156f576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b031633148061159757506002546001600160a01b031633145b806115b157503360009081526004602052604090205460ff165b6115ea576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a4d8282612bf1565b60008060008061160261312a565b935061160c6131cc565b92506116166129f6565b915061162182612aaf565b905090919293565b6000546001600160a01b031633148061164c57506002546001600160a01b031633145b8061166657503360009081526004602052604090205460ff165b61169f576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161323d565b6000546001600160a01b03163314806116cb57506002546001600160a01b031633145b806116e557503360009081526004602052604090205460ff165b61171e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081613468565b6000546001600160a01b031633148061174a57506002546001600160a01b031633145b8061176457503360009081526004602052604090205460ff165b61179d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61091081613534565b6000546001600160a01b03163314806117c957506002546001600160a01b031633145b806117e357503360009081526004602052604090205460ff165b61181c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000811180156118345750670de0b6b3a76400008111155b61186e576040805162461bcd60e51b8152602060048201526006602482015265313ab33332b960d11b604482015290519081900360640190fd5b600855565b6000546001600160a01b031633148061189657506002546001600160a01b031633145b806118b057503360009081526004602052604090205460ff165b6118e9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161372d565b6001546001600160a01b031681565b6000546001600160a01b031633148061192457506002546001600160a01b031633145b8061193e57503360009081526004602052604090205460ff165b611977576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109106001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f167f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643836121f5565b60046020526000908152604090205460ff1681565b6005546001600160a01b03163314611a2f576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9757600080fd5b505afa158015611aab573d6000803e3d6000fd5b505050506040513d6020811015611ac157600080fd5b50516001600160a01b031614611b1e576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b158015611b6557600080fd5b505afa158015611b79573d6000803e3d6000fd5b505050506040513d6020811015611b8f57600080fd5b50516001600160a01b031614611bd65760405162461bcd60e51b81526004018080602001828103825260258152602001806141396025913960400191505060405180910390fd5b60075460ff1615611beb57611beb6001612526565b6000611bf8600019612e92565b9050611c2e6001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f1684836121f5565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b158015611c7c57600080fd5b505af1158015611c90573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b60008211611ce9576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b6000611cf483612e92565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b158015611d4757600080fd5b505af1158015611d5b573d6000803e3d6000fd5b505050506040513d6020811015611d7157600080fd5b5051905082811015611db9576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b0316331480611e1d57506002546001600160a01b031633145b80611e3757503360009081526004602052604090205460ff165b611e70576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611eb3576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611f0057600080fd5b505af1158015611f14573d6000803e3d6000fd5b505050506040513d6020811015611f2a57600080fd5b5051905081811015611f74576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611f7c6137fa565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b60085481565b6000546001600160a01b0316331480611fe557506002546001600160a01b031633145b80611fff57503360009081526004602052604090205460ff165b612038576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610910816138b1565b6000546001600160a01b031633148061206457506002546001600160a01b031633145b61209d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b0381166120ef576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6000546001600160a01b031633148061216657506002546001600160a01b031633145b8061218057503360009081526004602052604090205460ff165b6121b9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6109108161397e565b6002546001600160a01b031681565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b80158061227b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561224d57600080fd5b505afa158015612261573d6000803e3d6000fd5b505050506040513d602081101561227757600080fd5b5051155b6122b65760405162461bcd60e51b81526004018080602001828103825260368152602001806141a96036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610f16908490613a4b565b60606123178484600085613afc565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f16908490613a4b565b60008060008060007f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663c37f68e2306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060806040518083038186803b1580156123e857600080fd5b505afa1580156123fc573d6000803e3d6000fd5b505050506040513d608081101561241257600080fd5b50805160208201516040830151606090930151919650945090925090508315612442576000945050505050610920565b6000670de0b6b3a76400006124578584612994565b8161245e57fe5b0490508281101561247757600095505050505050610920565b61251c8382037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b505190613c57565b9550505050505090565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561259557600080fd5b505afa1580156125a9573d6000803e3d6000fd5b505050506040513d60208110156125bf57600080fd5b505160408051600180825281830190925291925060009190602080830190803683370190505090507f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36438160008151811061261557fe5b6001600160a01b039092166020928302919091018201526040805162e1ed9760e51b8152306004820181815260248301938452855160448401528551733d9819210a31b4961b30ef54be2aed79b9c9cd3b95631c3db2e0959394889492606490910191858101910280838360005b8381101561269b578181015183820152602001612683565b505050509050019350505050600060405180830381600087803b1580156126c157600080fd5b505af11580156126d5573d6000803e3d6000fd5b5050604080516370a0823160e01b815230600482015290516000935073c00e94cb662c3520282e6f5717214004a7f2688892506370a0823191602480820192602092909190829003018186803b15801561272e57600080fd5b505afa158015612742573d6000803e3d6000fd5b505050506040513d602081101561275857600080fd5b5051905080156127a1576127a173c00e94cb662c3520282e6f5717214004a7f268887f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f83613cb1565b827f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561280f57600080fd5b505afa158015612823573d6000803e3d6000fd5b505050506040513d602081101561283957600080fd5b505103925083831015612882576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b82156128fb5760006127106128a26006548661299490919063ffffffff16565b816128a957fe5b04905080156128f9576003546128ec906001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f8116911683612321565b6128f68482613f05565b93505b505b6040805184815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a150505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261298e908590613a4b565b50505050565b6000826129a3575060006129f0565b828202828482816129b057fe5b04146129ed5760405162461bcd60e51b815260040180806020018281038252602181526020018061415e6021913960400191505060405180910390fd5b90505b92915050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b6001600160a01b0316638e8f294b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060606040518083038186803b158015612a7a57600080fd5b505afa158015612a8e573d6000803e3d6000fd5b505050506040513d6060811015612aa457600080fd5b506020015191505090565b6000600854821115612ac657506008548103612aca565b5060005b919050565b6000612ad9612373565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015612b2a57600080fd5b505afa158015612b3e573d6000803e3d6000fd5b505050506040513d6020811015612b5457600080fd5b50519050808211612b9c576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b808203612ba881612e92565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612bfb612373565b905082811015612c40576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b81811115612c83576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b158015612cd457600080fd5b505afa158015612ce8573d6000803e3d6000fd5b505050506040513d6020811015612cfe57600080fd5b5051905080851115612db457604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16916370a08231916024808301926020929190829003018186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d6020811015612d9f57600080fd5b5051915081841115612daf578193505b612dba565b84810392505b6000841180612dc95750600083115b15612e3b576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b158015612e2257600080fd5b505af1158015612e36573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f0257600080fd5b505afa158015612f16573d6000803e3d6000fd5b505050506040513d6020811015612f2c57600080fd5b50519050808311612f405782915050612aca565b8083036000612f4d61312a565b90506000612f596131cc565b90506000612f656129f6565b90506000612f7282612aaf565b90506000612f808585613f05565b905080861115612f8e578095505b6000612fb5612fa5670de0b6b3a764000085613f05565b612faf8986612994565b90613f62565b905084811115612fc25750835b612fd4612fcf8783613f05565b61323d565b612fdd876138b1565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561304c57600080fd5b505afa158015613060573d6000803e3d6000fd5b505050506040513d602081101561307657600080fd5b505190508a811015613092579850612aca975050505050505050565b50989998505050505050505050565b60075461010090046001600160a01b0316156130e9576007546130e99073c00e94cb662c3520282e6f5717214004a7f268889061010090046001600160a01b031660006121f5565b60078054610100600160a81b0319166101006001600160a01b0384160217905561091073c00e94cb662c3520282e6f5717214004a7f26888826000196121f5565b60007f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b0316633af9e669306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561319b57600080fd5b505af11580156131af573d6000803e3d6000fd5b505050506040513d60208110156131c557600080fd5b5051905090565b60007f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b03166317bfdfbc306040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561319b57600080fd5b600061324761312a565b905060006132536131cc565b905060006132618383613f05565b9050828411156132a5576040805162461bcd60e51b815260206004820152600a60248201526964656c6576657261676560b01b604482015290519081900360640190fd5b60006132af6129f6565b90508185116132bc578194505b60005b858511156133c5576019811061330c576040805162461bcd60e51b815260206004820152600d60248201526c36b0bc1034ba32b930ba34b7b760991b604482015290519081900360640190fd5b600061271061332861270f613322898988613fc9565b90612994565b8161332f57fe5b04905060008111613374576040805162461bcd60e51b815260206004820152600a602482015269072656465656d203d20360b41b604482015290519081900360640190fd5b8661337f8783613f05565b10156133925761338f8688613f05565b90505b61339b816138b1565b6133a481613468565b6133ae8682613f05565b95506133ba8582613f05565b9450506001016132bf565b505050505060006133d461312a565b905060006133e06131cc565b905060006133ec6129f6565b905060006133f982612aaf565b90506000670de0b6b3a76400006134108684612994565b8161341757fe5b04905080841115613460576040805162461bcd60e51b815260206004820152600e60248201526d0c4dee4e4deeecac8407c40dac2f60931b604482015290519081900360640190fd5b505050505050565b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b0316630e752702826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156134ce57600080fd5b505af11580156134e2573d6000803e3d6000fd5b505050506040513d60208110156134f857600080fd5b505115610910576040805162461bcd60e51b8152602060048201526005602482015264726570617960d81b604482015290519081900360640190fd5b670de0b6b3a76400006008541061354a57613723565b600061355461312a565b905060006135606131cc565b9050600061356e8383613f05565b9050828410156135b0576040805162461bcd60e51b81526020600482015260086024820152676c6576657261676560c01b604482015290519081900360640190fd5b60006135ba6129f6565b905060006135c782612aaf565b905060006135d482613fff565b905060006127106136026126ac670de0b6b3a76400006135f48987612994565b816135fb57fe5b0490612994565b8161360957fe5b049050808810613617578097505b60005b8888101561371a5760198110613667576040805162461bcd60e51b815260206004820152600d60248201526c36b0bc1034ba32b930ba34b7b760991b604482015290519081900360640190fd5b600061271061367d61270f6133228c8c8b61402c565b8161368457fe5b049050600081116136c9576040805162461bcd60e51b815260206004820152600a6024820152690626f72726f77203d20360b41b604482015290519081900360640190fd5b896136d48a83613c57565b11156136e7576136e48a8a613f05565b90505b6136f08161397e565b6136f98161372d565b6137038982613c57565b985061370f8882613c57565b97505060010161361a565b50505050505050505b60006133d461312a565b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561379357600080fd5b505af11580156137a7573d6000803e3d6000fd5b505050506040513d60208110156137bd57600080fd5b505115610910576040805162461bcd60e51b815260206004808301919091526024820152631b5a5b9d60e21b604482015290519081900360640190fd5b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561386957600080fd5b505afa15801561387d573d6000803e3d6000fd5b505050506040513d602081101561389357600080fd5b505190508015610910576138a68161372d565b610910600019613534565b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561391757600080fd5b505af115801561392b573d6000803e3d6000fd5b505050506040513d602081101561394157600080fd5b505115610910576040805162461bcd60e51b815260206004820152600660248201526572656465656d60d01b604482015290519081900360640190fd5b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663c5ebeaec826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156139e457600080fd5b505af11580156139f8573d6000803e3d6000fd5b505050506040513d6020811015613a0e57600080fd5b505115610910576040805162461bcd60e51b8152602060048201526006602482015265626f72726f7760d01b604482015290519081900360640190fd5b6000613aa0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123089092919063ffffffff16565b805190915015610f1657808060200190516020811015613abf57600080fd5b5051610f165760405162461bcd60e51b815260040180806020018281038252602a81526020018061417f602a913960400191505060405180910390fd5b606082471015613b3d5760405162461bcd60e51b81526004018080602001828103825260268152602001806141136026913960400191505060405180910390fd5b613b4685614068565b613b97576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310613bd55780518252601f199092019160209182019101613bb6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c37576040519150601f19603f3d011682016040523d82523d6000602084013e613c3c565b606091505b5091509150613c4c82828661406e565b979650505050505050565b6000828201838110156129ed576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60408051600380825260808201909252600091602082016060803683370190505090508381600081518110613ce257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110613d2457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508281600281518110613d5257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600760019054906101000a90046001600160a01b03166001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613e0c578181015183820152602001613df4565b505050509050019650505050505050600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613e7257600080fd5b8101908080516040519392919084640100000000821115613e9257600080fd5b908301906020820185811115613ea757600080fd5b8251866020820283011164010000000082111715613ec457600080fd5b82525081516020918201928201910280838360005b83811015613ef1578181015183820152602001613ed9565b505050509050016040525050505050505050565b600082821115613f5c576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808211613fb8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613fc157fe5b049392505050565b600080613fe283612faf86670de0b6b3a7640000612994565b9050808511613ff557600091505061231a565b9093039392505050565b60006129f0614016670de0b6b3a764000084613f05565b6ec097ce7bc90715b34b9f100000000090613f62565b600080670de0b6b3a76400006140428685612994565b8161404957fe5b04905080841061405d57600091505061231a565b929092039392505050565b3b151590565b6060831561407d57508161231a565b82511561408d5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156140d75781810151838201526020016140bf565b50505050905090810190601f1680156141045780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220c7042af53e05c8f76669f283deb9a0ca42c63572e21052e14cf7ae999102895264736f6c63430007060033

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

52621:318:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51796:347;;;;;;;;;;;;;;;;-1:-1:-1;51796:347:0;-1:-1:-1;;;;;51796:347:0;;:::i;:::-;;33372:101;;;:::i;:::-;;;;;;;;;;;;;;;;49377:116;;;;;;;;;;;;;;;;-1:-1:-1;49377:116:0;;:::i;28481:152::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28481:152:0;;;;;;;;:::i;35100:577::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49853:75;;;:::i;25969:218::-;;;:::i;24043:26::-;;;:::i;27436:498::-;;;;;;;;;;;;;;;;-1:-1:-1;27436:498:0;-1:-1:-1;;;;;27436:498:0;;:::i;50830:235::-;;;;;;;;;;;;;;;;-1:-1:-1;50830:235:0;;;;;;;;;;;;:::i;26585:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26585:235:0;;;;;;;;;;:::i;46931:584::-;;;;;;;;;;;;;;;;-1:-1:-1;46931:584:0;;:::i;28151:139::-;;;;;;;;;;;;;;;;-1:-1:-1;28151:139:0;;;;:::i;24210:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;32505:141;;;;;;;;;;;;;;;;-1:-1:-1;32505:141:0;-1:-1:-1;;;;;32505:141:0;;:::i;25624:239::-;;;;;;;;;;;;;;;;-1:-1:-1;25624:239:0;-1:-1:-1;;;;;25624:239:0;;:::i;23756:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23756:23:0;;;;;;;;;;;;;;23962:31;;;:::i;31537:18::-;;;:::i;26270:189::-;;;;;;;;;;;;;;;;-1:-1:-1;26270:189:0;-1:-1:-1;;;;;26270:189:0;;:::i;27282:146::-;;;;;;;;;;;;;;;;-1:-1:-1;27282:146:0;;:::i;50693:129::-;;;;;;;;;;;;;;;;-1:-1:-1;50693:129:0;;;;;;;:::i;34641:376::-;;;:::i;44869:109::-;;;;;;;;;;;;;;;;-1:-1:-1;44869:109:0;;:::i;37254:93::-;;;;;;;;;;;;;;;;-1:-1:-1;37254:93:0;;:::i;41031:105::-;;;;;;;;;;;;;;;;-1:-1:-1;41031:105:0;;:::i;33628:152::-;;;;;;;;;;;;;;;;-1:-1:-1;33628:152:0;;:::i;36678:95::-;;;;;;;;;;;;;;;;-1:-1:-1;36678:95:0;;:::i;23695:27::-;;;:::i;36348:117::-;;;;;;;;;;;;;;;;-1:-1:-1;36348:117:0;;:::i;23875:42::-;;;;;;;;;;;;;;;;-1:-1:-1;23875:42:0;-1:-1:-1;;;;;23875:42:0;;:::i;51073:591::-;;;;;;;;;;;;;;;;-1:-1:-1;51073:591:0;-1:-1:-1;;;;;51073:591:0;;:::i;23665:23::-;;;:::i;47523:331::-;;;;;;;;;;;;;;;;-1:-1:-1;47523:331:0;;;;;;;:::i;41543:304::-;;;;;;;;;;;;;;;;-1:-1:-1;41543:304:0;;;;;;;:::i;31824:32::-;;;:::i;37523:95::-;;;;;;;;;;;;;;;;-1:-1:-1;37523:95:0;;:::i;26912:280::-;;;;;;;;;;;;;;;;-1:-1:-1;26912:280:0;-1:-1:-1;;;;;26912:280:0;;:::i;36939:95::-;;;;;;;;;;;;;;;;-1:-1:-1;36939:95:0;;:::i;23729:20::-;;;:::i;23926:29::-;;;:::i;51796:347::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;51897:5:::1;-1:-1:-1::0;;;;;51879:24:0::1;:6;-1:-1:-1::0;;;;;51879:24:0::1;;;51871:52;;;::::0;;-1:-1:-1;;;51871:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51871:52:0;;;;;;;;;;;;;::::1;;51960:6;-1:-1:-1::0;;;;;51942:25:0::1;:6;-1:-1:-1::0;;;;;51942:25:0::1;;;51934:53;;;::::0;;-1:-1:-1;;;51934:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51934:53:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;52006:23:0;::::1;31736:42;52006:23;;51998:51;;;::::0;;-1:-1:-1;;;51998:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51998:51:0;;;;;;;;;;;;;::::1;;52088:5;::::0;52095:39:::1;::::0;;-1:-1:-1;;;52095:39:0;;52128:4:::1;52095:39;::::0;::::1;::::0;;;52060:75:::1;::::0;-1:-1:-1;;;;;52088:5:0;;::::1;::::0;52095:24;;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52095:39:0;-1:-1:-1;;;;;52060:27:0;::::1;::::0;:75;:27:::1;:75::i;:::-;51796:347:::0;:::o;33372:101::-;33427:4;33451:14;:12;:14::i;:::-;33444:21;;33372:101;;:::o;49377:116::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;49460:25:::1;49474:10;49460:13;:25::i;28481:152::-:0;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;28572:53:::1;-1:-1:-1::0;;;;;28572:5:0::1;:22;28595:5:::0;28610:4:::1;28617:7:::0;28572:22:::1;:53::i;:::-;28481:152:::0;;:::o;35100:577::-;35193:13;35221;35249:14;35278:12;35374:14;35390;35406:17;35427:6;-1:-1:-1;;;;;35427:35:0;;35471:4;35427:50;;;;;;;;;;;;;-1:-1:-1;;;;;35427:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35427:50:0;;;;;;;;;;;;;;;-1:-1:-1;35427:50:0;;-1:-1:-1;35427:50:0;-1:-1:-1;35529:4:0;35499:27;35427:50;;35499:13;:27::i;:::-;:34;;;;;;35488:45;;35555:9;35544:20;;35587:27;:25;:27::i;:::-;35575:39;;35635:34;35659:9;35635:23;:34::i;:::-;35625:44;;35100:577;;;;;;;:::o;49853:75::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;49913:7:::1;:5;:7::i;:::-;49853:75::o:0;25969:218::-;26037:12;;-1:-1:-1;;;;;26037:12:0;26023:10;:26;26015:54;;;;;-1:-1:-1;;;26015:54:0;;;;;;;;;;;;-1:-1:-1;;;26015:54:0;;;;;;;;;;;;;;;26080:8;:21;;-1:-1:-1;;;;;;26080:21:0;;;26091:10;26080:21;;;;;;;26112:25;;;;;;;26153:26;;;;;;;;;;;;;;;;25969:218::o;24043:26::-;;;;:::o;27436:498::-;24952:8;;-1:-1:-1;;;;;24952:8:0;24938:10;:22;24930:45;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;;;;27527:11:::1;::::0;-1:-1:-1;;;;;27527:11:0::1;27519:34:::0;27515:109:::1;;27596:11;::::0;27570:42:::1;::::0;-1:-1:-1;;;;;27570:5:0::1;:17:::0;::::1;::::0;27596:11:::1;;27570:17;:42::i;:::-;27704:5;-1:-1:-1::0;;;;;27658:52:0::1;27671:12;-1:-1:-1::0;;;;;27658:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27658:34:0;-1:-1:-1;;;;;27658:52:0::1;;27636:133;;;::::0;;-1:-1:-1;;;27636:133:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27782:11;:40:::0;;-1:-1:-1;;;;;;27782:40:0::1;-1:-1:-1::0;;;;;27782:40:0;;::::1;::::0;;;::::1;::::0;;;27833:47:::1;::::0;:5:::1;:17;27782:40:::0;-1:-1:-1;;27833:17:0::1;:47::i;:::-;27898:28;::::0;;-1:-1:-1;;;;;27898:28:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;27436:498:::0;:::o;50830:235::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;50974:25:::1;50988:10;50974:13;:25::i;:::-;51010:7;:5;:7::i;:::-;51028:29;51036:9;51047;51028:7;:29::i;:::-;50830:235:::0;;;:::o;26585:::-;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26685:19:0;::::1;26677:48;;;::::0;;-1:-1:-1;;;26677:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26677:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;26736:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:31;;-1:-1:-1;;26736:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;26783:29;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;26585:235:::0;;:::o;46931:584::-;25395:11;;47042:9;;-1:-1:-1;;;;;25395:11:0;25373:10;:34;25365:60;;;;;-1:-1:-1;;;25365:60:0;;;;;;;;;;;;-1:-1:-1;;;25365:60:0;;;;;;;;;;;;;;;47087:1:::1;47077:7;:11;47069:36;;;::::0;;-1:-1:-1;;;47069:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;47069:36:0;;;;;;;;;;;;;::::1;;47150:14;47167:18;47177:7;47167:9;:18::i;:::-;47210:11;::::0;:34:::1;::::0;;-1:-1:-1;;;47210:34:0;;47238:4:::1;47210:34;::::0;::::1;::::0;;;47150:35;;-1:-1:-1;47198:9:0::1;::::0;-1:-1:-1;;;;;47210: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;47210:34:0;;-1:-1:-1;47255:10:0::1;47268:14;:12;:14::i;:::-;47255:27;;47304:5;47297:4;:12;47293:64;;;47340:5;47333:4;:12;47326:19;;47293:64;47373:13:::0;;47369:87:::1;;47403:41;-1:-1:-1::0;;;;;47403:5:0::1;:18;47422:10;47434:9:::0;47403:18:::1;:41::i;:::-;47473:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;25436:1;;;46931:584:::0;;;:::o;28151:139::-;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;28245:21:::1;:37:::0;;-1:-1:-1;;28245:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28151:139::o;24210:40::-;;;;;;:::o;32505:141::-;24952:8;;-1:-1:-1;;;;;24952:8:0;24938:10;:22;24930:45;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32576:18:0;::::1;32568:46;;;::::0;;-1:-1:-1;;;32568:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32568:46:0;;;;;;;;;;;;;::::1;;32625:13;32633:4;32625:7;:13::i;25624:239::-:0;24952:8;;-1:-1:-1;;;;;24952:8:0;24938:10;:22;24930:45;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;-1:-1:-1;;;24930:45:0;;;;;;;;;;;;;;;25781:12:::1;:28:::0;;-1:-1:-1;;;;;25781:28:0;::::1;-1:-1:-1::0;;;;;;25781:28:0;;::::1;::::0;::::1;::::0;;;25825:30:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;25624:239:::0;:::o;23756:23::-;;;-1:-1:-1;;;;;23756:23:0;;:::o;23962:31::-;;;-1:-1:-1;;;;;23962:31:0;;:::o;31537:18::-;;;;;;-1:-1:-1;;;;;31537:18:0;;:::o;26270:189::-;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26352:20:0;::::1;26344:50;;;::::0;;-1:-1:-1;;;26344:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26344:50:0;;;;;;;;;;;;;::::1;;26405:5;:14:::0;;-1:-1:-1;;;;;26405:14:0;::::1;-1:-1:-1::0;;;;;;26405:14:0;;::::1;::::0;::::1;::::0;;;26435:16:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26270:189:::0;:::o;27282:146::-;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;24113:4:::1;27361;:20;;27353:42;;;::::0;;-1:-1:-1;;;27353:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27353:42:0;;;;;;;;;;;;;::::1;;27406:7;:14:::0;27282:146::o;50693:129::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;50785:29:::1;50793:9;50804;50785:7;:29::i;34641:376::-:0;34718:13;34746;34774:14;34803:12;34854:14;:12;:14::i;:::-;34843:25;;34890:14;:12;:14::i;:::-;34879:25;;34927:27;:25;:27::i;:::-;34915:39;;34975:34;34999:9;34975:23;:34::i;:::-;34965:44;;34641:376;;;;:::o;44869:109::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;44944:26:::1;44956:13;44944:11;:26::i;37254:93::-:0;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;37324:15:::1;37331:7;37324:6;:15::i;41031:105::-:0;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;41104:24:::1;41114:13;41104:9;:24::i;33628:152::-:0;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;33714:1:::1;33704:7;:11;:30;;;;;33730:4;33719:7;:15;;33704:30;33696:49;;;::::0;;-1:-1:-1;;;33696:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33696:49:0;;;;;;;;;;;;;::::1;;33756:6;:16:::0;33628:152::o;36678:95::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;36749:16:::1;36757:7;36749;:16::i;23695:27::-:0;;;-1:-1:-1;;;;;23695:27:0;;:::o;36348:117::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;36414:43:::1;-1:-1:-1::0;;;;;36414:5:0::1;:17;36440:6;36449:7:::0;36414:17:::1;:43::i;23875:42::-:0;;;;;;;;;;;;;;;:::o;51073:591::-;25395:11;;-1:-1:-1;;;;;25395:11:0;25373:10;:34;25365:60;;;;;-1:-1:-1;;;25365:60:0;;;;;;;;;;;;-1:-1:-1;;;25365:60:0;;;;;;;;;;;;;;;51154:14:::1;51180:9;51154:36;;51243:5;-1:-1:-1::0;;;;;51209:40:0::1;51217:5;-1:-1:-1::0;;;;;51217:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51217:13:0;-1:-1:-1;;;;;51209:40:0::1;;51201:76;;;::::0;;-1:-1:-1;;;51201:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;51350:11;::::0;51318:19:::1;::::0;;-1:-1:-1;;;51318:19:0;;;;-1:-1:-1;;;;;51350:11:0;;::::1;::::0;51318: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;51318:19:0;-1:-1:-1;;;;;51310:52:0::1;;51288:139;;;;-1:-1:-1::0;;;51288:139:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51444:21;::::0;::::1;;51440:70;;;51482:16;51496:1;51482:13;:16::i;:::-;51522:8;51533:25;-1:-1:-1::0;;51533:9:0::1;:25::i;:::-;51522:36:::0;-1:-1:-1;51569:33:0::1;-1:-1:-1::0;;;;;51569:5:0::1;:17;51587:9:::0;51522:36;51569:17:::1;:33::i;:::-;51613:43;::::0;;-1:-1:-1;;;51613:43:0;;51645:4:::1;51613:43;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;51613:23:0;::::1;::::0;::::1;::::0;:43;;;;;-1:-1:-1;;51613:43:0;;;;;;;-1:-1:-1;51613:23:0;:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25436:1;;51073:591:::0;:::o;23665:23::-;;;-1:-1:-1;;;;;23665:23:0;;:::o;47523:331::-;47610:1;47600:7;:11;47592:33;;;;;-1:-1:-1;;;47592:33:0;;;;;;;;;;;;-1:-1:-1;;;47592:33:0;;;;;;;;;;;;;;;47668:14;47685:18;47695:7;47685:9;:18::i;:::-;47728:11;;:28;;;-1:-1:-1;;;47728:28:0;;;;;;;;;;47668:35;;-1:-1:-1;47714:11:0;;-1:-1:-1;;;;;47728:11:0;;;;:17;;:28;;;;;;;;;;;;;;;47714:11;47728;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47728:28:0;;-1:-1:-1;47775:14:0;;;;47767:39;;;;;-1:-1:-1;;;47767:39:0;;;;;;;;;;;;-1:-1:-1;;;47767:39:0;;;;;;;;;;;;;;;47824:22;;;;;;;;;;;;;;;;;;;;;;;;;47523:331;;;;:::o;41543:304::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;41647:1:::1;41637:7;:11;41629:35;;;::::0;;-1:-1:-1;;;41629:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41629:35:0;;;;;;;;;;;;;::::1;;41693:11;::::0;:27:::1;::::0;;-1:-1:-1;;;41693:27:0;;::::1;::::0;::::1;::::0;;;;;41677:13:::1;::::0;-1:-1:-1;;;;;41693:11:0::1;::::0;:18:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;41677:13;41693:11;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41693:27:0;;-1:-1:-1;41739:16:0;;::::1;;41731:43;;;::::0;;-1:-1:-1;;;41731:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41731:43:0;;;;;;;;;;;;;::::1;;41787:10;:8;:10::i;:::-;41813:26;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25310:1;41543:304:::0;;:::o;31824:32::-;;;;:::o;37523:95::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;37594:16:::1;37602:7;37594;:16::i;26912:280::-:0;25067:8;;-1:-1:-1;;;;;25067:8:0;25053:10;:22;;:45;;-1:-1:-1;25093:5:0;;-1:-1:-1;;;;;25093:5:0;25079:10;:19;25053:45;25045:63;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;-1:-1:-1;;;25045:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27067:23:0;::::1;27059:56;;;::::0;;-1:-1:-1;;;27059:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27059:56:0;;;;;;;;;;;;;::::1;;27126:8;:20:::0;;-1:-1:-1;;;;;27126:20:0;::::1;-1:-1:-1::0;;;;;;27126:20:0;;::::1;::::0;::::1;::::0;;;27162:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26912:280:::0;:::o;36939:95::-;25209:8;;-1:-1:-1;;;;;25209:8:0;25195:10;:22;;:45;;-1:-1:-1;25235:5:0;;-1:-1:-1;;;;;25235:5:0;25221:10;:19;25195:45;:71;;;-1:-1:-1;25255:10:0;25244:22;;;;:10;:22;;;;;;;;25195:71;25173:126;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;-1:-1:-1;;;25173:126:0;;;;;;;;;;;;;;;37010:16:::1;37018:7;37010;:16::i;23729:20::-:0;;;-1:-1:-1;;;;;23729:20:0;;:::o;23926:29::-;;;:::o;13377:704::-;13792:10;;;13791:62;;-1:-1:-1;13808:39:0;;;-1:-1:-1;;;13808:39:0;;13832:4;13808:39;;;;-1:-1:-1;;;;;13808:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13808:39:0;:44;13791:62;13769:166;;;;-1:-1:-1;;;13769:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14000:62;;;-1:-1:-1;;;;;14000:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14000:62:0;-1:-1:-1;;;14000:62:0;;;13946:127;;13980:5;;13946:19;:127::i;3640:229::-;3777:12;3809:52;3831:6;3839:4;3845:1;3848:12;3809:21;:52::i;:::-;3802:59;;3640:229;;;;;;:::o;12573:245::-;12741:58;;;-1:-1:-1;;;;;12741:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12741:58:0;-1:-1:-1;;;12741:58:0;;;12687:123;;12721:5;;12687:19;:123::i;32654:632::-;32700:10;32807;32819:14;32835:13;32850:17;32871:6;-1:-1:-1;;;;;32871:35:0;;32915:4;32871:50;;;;;;;;;;;;;-1:-1:-1;;;;;32871:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32871:50:0;;;;;;;;;;;;;;;;;-1:-1:-1;32871:50:0;-1:-1:-1;32871:50:0;;-1:-1:-1;32871:50:0;-1:-1:-1;32938:9:0;;32934:95;;33016:1;33009:8;;;;;;;;32934:95;33039:13;33085:4;33055:27;:9;33069:12;33055:13;:27::i;:::-;:34;;;;;;33039:50;;33115:8;33104;:19;33100:105;;;33192:1;33185:8;;;;;;;;;33100:105;33223:55;33269:8;33258;:19;33223:5;-1:-1:-1;;;;;33223:15:0;;33247:4;33223:30;;;;;;;;;;;;;-1:-1:-1;;;;;33223:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33223:30:0;;:34;:55::i;:::-;33215:63;;32654:632;;;;;;:::o;48424:945::-;48563:9;48575:5;-1:-1:-1;;;;;48575:15:0;;48599:4;48575:30;;;;;;;;;;;;;-1:-1:-1;;;;;48575:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48575:30:0;48668:16;;;48682:1;48668:16;;;;;;;;;48575:30;;-1:-1:-1;48641:24:0;;48668:16;;;;;;;;;;;;-1:-1:-1;48668:16:0;48641:43;;48716:6;48695:7;48703:1;48695:10;;;;;;;;-1:-1:-1;;;;;48695:28:0;;;:10;;;;;;;;;;:28;48734:45;;;-1:-1:-1;;;48734:45:0;;48764:4;48734:45;;;;;;;;;;;;;;;;;;;;31648:42;;48734:21;;48764:4;;48771:7;;48734:45;;;;;;;;;;;;;;-1:-1:-1;48734:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48807:29:0;;;-1:-1:-1;;;48807:29:0;;48830:4;48807:29;;;;;;48792:12;;-1:-1:-1;31736:42:0;;-1:-1:-1;48807:14:0;;:29;;;;;;;;;;;;;;;31736:42;48807:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48807:29:0;;-1:-1:-1;48851:11:0;;48847:89;;48879:45;31736:42;48908:5;48916:7;48879:5;:45::i;:::-;48988:4;48955:5;-1:-1:-1;;;;;48955:15:0;;48979:4;48955:30;;;;;;;;;;;;;-1:-1:-1;;;;;48955:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48955:30:0;:37;;-1:-1:-1;49011:18:0;;;;49003:43;;;;;-1:-1:-1;;;49003:43:0;;;;;;;;;;;;-1:-1:-1;;;49003:43:0;;;;;;;;;;;;;;;49112:8;;49108:218;;49137:8;24196:5;49148:17;49157:7;;49148:4;:8;;:17;;;;:::i;:::-;:32;;;;;;;-1:-1:-1;49199:7:0;;49195:120;;49246:8;;49227:33;;-1:-1:-1;;;;;49227:5:0;:18;;;49246:8;49256:3;49227:18;:33::i;:::-;49286:13;:4;49295:3;49286:8;:13::i;:::-;49279:20;;49195:120;49108:218;;49343:18;;;;;;;;;;;;;;;;;48424:945;;;;:::o;12826:282::-;13021:68;;;-1:-1:-1;;;;;13021:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13021:68:0;-1:-1:-1;;;13021:68:0;;;12967:133;;13001:5;;12967:19;:133::i;:::-;12826:282;;;;:::o;19073:208::-;19125:4;19146:6;19142:20;;-1:-1:-1;19161:1:0;19154:8;;19142:20;19182:5;;;19186:1;19182;:5;:1;19206:5;;;;;:10;19198:56;;;;-1:-1:-1;;;19198:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19272:1;-1:-1:-1;19073:208:0;;;;;:::o;33788:287::-;33847:4;33996:8;31648:42;-1:-1:-1;;;;;34010:19:0;;34038:6;34010:36;;;;;;;;;;;;;-1:-1:-1;;;;;34010:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34010:36:0;;;;-1:-1:-1;;33788:287:0;:::o;34083:193::-;34155:4;34189:6;;34176:10;:19;34172:78;;;-1:-1:-1;34232:6:0;;34219:19;;34212:26;;34172:78;-1:-1:-1;34267:1:0;34083:193;;;;:::o;49501:344::-;49537:10;49550:14;:12;:14::i;:::-;49587:11;;:34;;;-1:-1:-1;;;49587:34:0;;49615:4;49587:34;;;;;;49537:27;;-1:-1:-1;49575:9:0;;-1:-1:-1;;;;;49587:11:0;;;;:19;;:34;;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49587:34:0;;-1:-1:-1;49640:12:0;;;49632:38;;;;;-1:-1:-1;;;49632:38:0;;;;;;;;;;;;-1:-1:-1;;;49632:38:0;;;;;;;;;;;;;;;49697:12;;;49777:17;49697:12;49777:9;:17::i;:::-;49812:25;;;;;;;;;;;;;;;;;;;;49768:26;;-1:-1:-1;49812:25:0;;;;;;;;;;49501:344;;;:::o;49936:749::-;50004:10;50017:14;:12;:14::i;:::-;50004:27;;50059:9;50050:5;:18;;50042:42;;;;;-1:-1:-1;;;50042:42:0;;;;;;;;;;;;-1:-1:-1;;;50042:42:0;;;;;;;;;;;;;;;50112:9;50103:5;:18;;50095:42;;;;;-1:-1:-1;;;50095:42:0;;;;;;;;;;;;-1:-1:-1;;;50095:42:0;;;;;;;;;;;;;;;50234:11;;:34;;;-1:-1:-1;;;50234:34:0;;50262:4;50234:34;;;;;;50150:9;;;;;;;;-1:-1:-1;;;;;50234:11:0;;:19;;:34;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50234:34:0;;-1:-1:-1;50285:12:0;;;50281:247;;;50357:30;;;-1:-1:-1;;;50357:30:0;;50381:4;50357:30;;;;;;50321:12;;;;-1:-1:-1;;;;;;50357:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50357:30:0;;-1:-1:-1;50406:11:0;;;50402:63;;;50445:4;50438:11;;50402:63;50281:247;;;50511:5;50504:4;:12;50497:19;;50281:247;50551:1;50544:4;:8;:20;;;;50563:1;50556:4;:8;50544:20;50540:83;;;50581:11;;:30;;;-1:-1:-1;;;50581:30:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50581:11:0;;;;:18;;:30;;;;;:11;;:30;;;;;;;;:11;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50540:83;50640:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49936:749;;;;;;;:::o;45037:1644::-;45087:4;45104:8;45115:5;-1:-1:-1;;;;;45115:15:0;;45139:4;45115:30;;;;;;;;;;;;;-1:-1:-1;;;;;45115:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45115:30:0;;-1:-1:-1;45160:14:0;;;45156:61;;45198:7;45191:14;;;;;45156:61;45249:13;;;45229:17;45884:14;:12;:14::i;:::-;45868:30;;45909:13;45925:14;:12;:14::i;:::-;45909:30;;45950:14;45967:27;:25;:27::i;:::-;45950:44;;46005:12;46020:34;46044:9;46020:23;:34::i;:::-;46005:49;-1:-1:-1;46065:16:0;46084:22;:8;46097;46084:12;:22::i;:::-;46065:41;;46159:11;46144:12;:26;46140:85;;;46202:11;46187:26;;46140:85;46270:16;46289:54;46319:23;46324:4;46334:7;46319:14;:23::i;:::-;46289:25;:12;46306:7;46289:16;:25::i;:::-;:29;;:54::i;:::-;46270:73;;46372:8;46358:11;:22;46354:77;;;-1:-1:-1;46411:8:0;46354:77;46443:38;46455:25;:8;46468:11;46455:12;:25::i;:::-;46443:11;:38::i;:::-;46492:21;46500:12;46492:7;:21::i;:::-;46526:13;46542:5;-1:-1:-1;;;;;46542:15:0;;46566:4;46542:30;;;;;;;;;;;;;-1:-1:-1;;;;;46542:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46542:30:0;;-1:-1:-1;46587:18:0;;;46583:66;;;46629:8;-1:-1:-1;46622:15:0;;-1:-1:-1;;;;;;;;46622:15:0;46583:66;-1:-1:-1;46666:7:0;;45037:1644;-1:-1:-1;;;;;;;;;45037:1644:0:o;32292:205::-;32346:3;;;;;-1:-1:-1;;;;;32346:3:0;:17;32342:74;;32397:3;;32380:24;;31736:42;;32397:3;;;-1:-1:-1;;;;;32397:3:0;32402:1;32380:16;:24::i;:::-;32428:3;:10;;-1:-1:-1;;;;;;32428:10:0;;-1:-1:-1;;;;;32428:10:0;;;;;;32451:38;31736:42;32428:10;-1:-1:-1;;32451:16:0;:38::i;34310:114::-;34351:4;34375:6;-1:-1:-1;;;;;34375:26:0;;34410:4;34375:41;;;;;;;;;;;;;-1:-1:-1;;;;;34375:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34375:41:0;;-1:-1:-1;34310:114:0;:::o;34458:115::-;34499:4;34523:6;-1:-1:-1;;;;;34523:27:0;;34559:4;34523:42;;;;;;;;;;;;;-1:-1:-1;;;;;34523:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;43516:1345;43597:13:::1;43613:14;:12;:14::i;:::-;43597:30;;43638:13;43654:14;:12;:14::i;:::-;43638:30:::0;-1:-1:-1;43679:16:0::1;43698:22;:8:::0;43638:30;43698:12:::1;:22::i;:::-;43679:41;;43756:8;43739:13;:25;;43731:48;;;::::0;;-1:-1:-1;;;43731:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43731:48:0;;;;;;;;;;;;;::::1;;43790:14;43807:27;:25;:27::i;:::-;43790:44;;43889:11;43872:13;:28;43868:88;;43933:11;43917:27;;43868:88;43966:6;43983:871;44001:13;43990:8;:24;43983:871;;;44101:2;44097:1;:6;44089:32;;;::::0;;-1:-1:-1;;;44089:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44089:32:0;;;;;;;;;;;;;::::1;;44170:17;44284:5;44190:91;44262:4;44191:47;44208:8;44218;44228:9;44191:16;:47::i;:::-;44190:53:::0;::::1;:91::i;:::-;:99;;;;;;44170:119;;44327:1;44312:12;:16;44304:39;;;::::0;;-1:-1:-1;;;44304:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44304:39:0;;;;;;;;;;;;;::::1;;44391:13:::0;44362:26:::1;:8:::0;44375:12;44362::::1;:26::i;:::-;:42;44358:187;;;44502:27;:8:::0;44515:13;44502:12:::1;:27::i;:::-;44487:42;;44358:187;44559:21;44567:12;44559:7;:21::i;:::-;44595:20;44602:12;44595:6;:20::i;:::-;44703:26;:8:::0;44716:12;44703::::1;:26::i;:::-;44692:37:::0;-1:-1:-1;44798:26:0::1;:8:::0;44811:12;44798::::1;:26::i;:::-;44787:37:::0;-1:-1:-1;;44839:3:0::1;;43983:871;;;35808:1;;;;;35820:13:::0;35836:14;:12;:14::i;:::-;35820:30;;35861:13;35877:14;:12;:14::i;:::-;35861:30;;35902:14;35919:27;:25;:27::i;:::-;35902:44;;35957:12;35972:34;35996:9;35972:23;:34::i;:::-;35957:49;-1:-1:-1;36157:8:0;36192:4;36168:21;:8;35957:49;36168:12;:21::i;:::-;:28;;;;;;36157:39;;36227:3;36215:8;:15;;36207:42;;;;;-1:-1:-1;;;36207:42:0;;;;;;;;;;;;-1:-1:-1;;;36207:42:0;;;;;;;;;;;;;;;43516:1345;;;;;;:::o;37042:107::-;37099:6;-1:-1:-1;;;;;37099:18:0;;37118:7;37099:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37099:27:0;:32;37091:50;;;;;-1:-1:-1;;;37091:50:0;;;;;;;;;;;;-1:-1:-1;;;37091:50:0;;;;;;;;;;;;;;39084:1939;39235:4:::1;39225:6;;:14;39221:53;;39256:7;;39221:53;39284:13;39300:14;:12;:14::i;:::-;39284:30;;39325:13;39341:14;:12;:14::i;:::-;39325:30:::0;-1:-1:-1;39366:16:0::1;39385:22;:8:::0;39325:30;39385:12:::1;:22::i;:::-;39366:41;;39469:8;39452:13;:25;;39444:46;;;::::0;;-1:-1:-1;;;39444:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39444:46:0;;;;;;;;;;;;;::::1;;39501:14;39518:27;:25;:27::i;:::-;39501:44;;39556:12;39571:34;39595:9;39571:23;:34::i;:::-;39556:49;;39616:8;39627:29;39648:7;39627:20;:29::i;:::-;39616:40:::0;-1:-1:-1;39708:8:0::1;39761:5;39719:39;39753:4;39743;39720:20;:11:::0;39616:40;39720:15:::1;:20::i;:::-;:27;;;;;;::::0;39719:33:::1;:39::i;:::-;:47;;;;;;39708:58;;39798:3;39781:13;:20;39777:72;;39834:3;39818:19;;39777:72;39859:6;39876:1140;39894:13;39883:8;:24;39876:1140;;;39994:2;39990:1;:6;39982:32;;;::::0;;-1:-1:-1;;;39982:32:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39982:32:0;;;;;;;;;;;;;::::1;;40210:17;40322:5;40230:89;40300:4;40230:47;40247:8;40257;40267:9;40230:16;:47::i;:89::-;:97;;;;;;40210:117;;40365:1;40350:12;:16;40342:39;;;::::0;;-1:-1:-1;;;40342:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40342:39:0;;;;;;;;;;;;;::::1;;40429:13:::0;40400:26:::1;:8:::0;40413:12;40400::::1;:26::i;:::-;:42;40396:187;;;40540:27;:13:::0;40558:8;40540:17:::1;:27::i;:::-;40525:42;;40396:187;40597:21;40605:12;40597:7;:21::i;:::-;40718;40726:12;40718:7;:21::i;:::-;40867:26;:8:::0;40880:12;40867::::1;:26::i;:::-;40856:37:::0;-1:-1:-1;40960:26:0::1;:8:::0;40973:12;40960::::1;:26::i;:::-;40949:37:::0;-1:-1:-1;;41001:3:0::1;;39876:1140;;;35808:1;;;;;;;;;35820:13:::0;35836:14;:12;:14::i;36473:100::-;36531:6;-1:-1:-1;;;;;36531:11:0;;36543:7;36531:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36531:20:0;:25;36523:42;;;;;-1:-1:-1;;;36523:42:0;;;;;;;;;;;;;;;-1:-1:-1;;;36523:42:0;;;;;;;;;;;;;;41144:222;41183:8;41194:5;-1:-1:-1;;;;;41194:15:0;;41218:4;41194:30;;;;;;;;;;;;;-1:-1:-1;;;;;41194:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41194:30:0;;-1:-1:-1;41239:7:0;;41235:124;;41263:12;41271:3;41263:7;:12::i;:::-;41322:25;-1:-1:-1;;41322:9:0;:25::i;37355:114::-;37413:6;-1:-1:-1;;;;;37413:23:0;;37437:7;37413:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37413:32:0;:37;37405:56;;;;;-1:-1:-1;;;37405:56:0;;;;;;;;;;;;-1:-1:-1;;;37405:56:0;;;;;;;;;;;;;;36781:104;36839:6;-1:-1:-1;;;;;36839:13:0;;36853:7;36839:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36839:22:0;:27;36831:46;;;;;-1:-1:-1;;;36831:46:0;;;;;;;;;;;;-1:-1:-1;;;36831:46:0;;;;;;;;;;;;;;15272:860;15696:23;15722:106;15764:4;15722:106;;;;;;;;;;;;;;;;;15730:5;-1:-1:-1;;;;;15722:27:0;;;:106;;;;;:::i;:::-;15843:17;;15696:132;;-1:-1:-1;15843:21:0;15839:286;;16016:10;16005:30;;;;;;;;;;;;;;;-1:-1:-1;16005:30:0;15979:134;;;;-1:-1:-1;;;15979:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4853:605;5020:12;5092:5;5067:21;:30;;5045:118;;;;-1:-1:-1;;;5045:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5182:18;5193:6;5182:10;:18::i;:::-;5174:60;;;;;-1:-1:-1;;;5174:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5308:12;5322:23;5349:6;-1:-1:-1;;;;;5349:11:0;5368:5;5375:4;5349:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5349:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5307:73;;;;5398:52;5416:7;5425:10;5437:12;5398:17;:52::i;:::-;5391:59;4853:605;-1:-1:-1;;;;;;;4853:605:0:o;18215:167::-;18267:4;18293:5;;;18317:6;;;;18309:46;;;;;-1:-1:-1;;;18309:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;47950:466;48133:16;;;48147:1;48133:16;;;;;;;;;48109:21;;48133:16;;;;;;;;;;-1:-1:-1;48133:16:0;48109:40;;48170:5;48160:4;48165:1;48160:7;;;;;;;;;;;;;:15;-1:-1:-1;;;;;48160:15:0;;;-1:-1:-1;;;;;48160:15:0;;;;;31488:42;48186:4;48191:1;48186:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;48186:14:0;;;-1:-1:-1;;;;;48186:14:0;;;;;48221:3;48211:4;48216:1;48211:7;;;;;;;;;;;;;:13;-1:-1:-1;;;;;48211:13:0;;;-1:-1:-1;;;;;48211:13:0;;;;;48253:3;;;;;;;;;-1:-1:-1;;;;;48253:3:0;-1:-1:-1;;;;;48237:45:0;;48297:7;48319:1;48335:4;48362;48382:15;48237:171;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48237:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48237:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48237:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47950:466;;;;:::o;18665:149::-;18717:4;18747:1;18742;:6;;18734:49;;;;;-1:-1:-1;;;18734:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18801:5:0;;;18665:149::o;19759:144::-;19811:4;19840:1;19836;:5;19828:44;;;;;-1:-1:-1;;;19828:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19894:1;19890;:5;;;;;;;19759:144;-1:-1:-1;;;19759:144:0:o;41855:548::-;41980:4;;42266:29;42290:4;42266:19;:9;42280:4;42266:13;:19::i;:29::-;42255:40;;42323:3;42310:9;:16;42306:57;;42350:1;42343:8;;;;;42306:57;42380:15;;;;41855:548;-1:-1:-1;;;41855:548:0:o;37626:280::-;37689:4;37862:36;37877:20;37882:4;37892;37877:14;:20::i;:::-;37867:4;;37862:14;:36::i;37914:502::-;38039:4;;38304;38282:19;:9;38296:4;38282:13;:19::i;:::-;:26;;;;;;38271:37;;38336:3;38323:9;:16;38319:57;;38363:1;38356:8;;;;;38319:57;38393:15;;;;;37914:502;-1:-1:-1;;;37914:502:0:o;683:441::-;1060:20;1108:8;;;683:441::o;7683:777::-;7833:12;7862:7;7858:595;;;-1:-1:-1;7893:10:0;7886:17;;7858:595;8007:17;;:21;8003:439;;8270:10;8264:17;8331:15;8318:10;8314:2;8310:19;8303:44;8218:148;8413:12;8406:20;;-1:-1:-1;;;8406:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://c7042af53e05c8f76669f283deb9a0ca42c63572e21052e14cf7ae9991028952

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.