ETH Price: $3,764.11 (-2.40%)
Gas: 23 Gwei

Contract

0x086C98855dF3C78C6b481b6e1D47BeF42E9aC36B
 
Transaction Hash
Method
Block
From
To
Value
Audit Reserves145521282022-04-09 14:47:26781 days ago1649515646IN
Redacted Cartel: Treasury
0 ETH0.0093730643.32142724
Audit Reserves143355462022-03-06 20:51:32814 days ago1646599892IN
Redacted Cartel: Treasury
0 ETH0.0119975660.49905027
Audit Reserves143229402022-03-04 21:30:40816 days ago1646429440IN
Redacted Cartel: Treasury
0 ETH0.0165977883.65820174
Manage138663872021-12-24 6:49:44887 days ago1640328584IN
Redacted Cartel: Treasury
0 ETH0.0044282249.22768691
Push Management138579492021-12-22 23:29:45888 days ago1640215785IN
Redacted Cartel: Treasury
0 ETH0.0041726487.39069107
Toggle138512692021-12-21 22:28:27889 days ago1640125707IN
Redacted Cartel: Treasury
0 ETH0.00891258108.67284052
Queue138512632021-12-21 22:27:01889 days ago1640125621IN
Redacted Cartel: Treasury
0 ETH0.00599252118.6473642
Toggle138511522021-12-21 22:02:17889 days ago1640124137IN
Redacted Cartel: Treasury
0 ETH0.00352725130.03708721
Queue138511462021-12-21 22:00:46889 days ago1640124046IN
Redacted Cartel: Treasury
0 ETH0.0045698490.47938467
Toggle138511052021-12-21 21:53:24889 days ago1640123604IN
Redacted Cartel: Treasury
0 ETH0.01055324132.70849655
Queue138511012021-12-21 21:52:07889 days ago1640123527IN
Redacted Cartel: Treasury
0 ETH0.00549295108.75625949
Set Floor138495682021-12-21 16:19:56889 days ago1640103596IN
Redacted Cartel: Treasury
0 ETH0.0025387753.25064529
Toggle138495242021-12-21 16:11:30889 days ago1640103090IN
Redacted Cartel: Treasury
0 ETH0.0088333775.86334292
Queue138495182021-12-21 16:10:51889 days ago1640103051IN
Redacted Cartel: Treasury
0 ETH0.00534311106.11741949
Audit Reserves138431342021-12-20 16:29:01890 days ago1640017741IN
Redacted Cartel: Treasury
0 ETH0.0076324662.70564642
Manage138428792021-12-20 15:35:59891 days ago1640014559IN
Redacted Cartel: Treasury
0 ETH0.0077335989.23546976
Audit Reserves138428462021-12-20 15:26:46891 days ago1640014006IN
Redacted Cartel: Treasury
0 ETH0.0079331165.1275302
Manage138426962021-12-20 14:52:22891 days ago1640011942IN
Redacted Cartel: Treasury
0 ETH0.0051468956.27917239
Toggle138310822021-12-18 19:43:18892 days ago1639856598IN
Redacted Cartel: Treasury
0 ETH0.0040470942.96056423
Queue138310472021-12-18 19:37:33892 days ago1639856253IN
Redacted Cartel: Treasury
0 ETH0.0024085547.85330187
Audit Reserves138277812021-12-18 7:32:25893 days ago1639812745IN
Redacted Cartel: Treasury
0 ETH0.0058405142.10015217
Set Floor138277752021-12-18 7:31:24893 days ago1639812684IN
Redacted Cartel: Treasury
0 ETH0.0021627345.36318381
Toggle138277572021-12-18 7:29:12893 days ago1639812552IN
Redacted Cartel: Treasury
0 ETH0.0042799449.37468533
Queue138277502021-12-18 7:27:46893 days ago1639812466IN
Redacted Cartel: Treasury
0 ETH0.0026708253.20902631
Audit Reserves138277252021-12-18 7:21:32893 days ago1639812092IN
Redacted Cartel: Treasury
0 ETH0.0046923846.14942058
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
REDACTEDTreasury

Compiler Version
v0.7.5+commit.eb77ed08

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-12-17
*/

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

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}

library Address {

  function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

interface IOwnable {
  function manager() external view returns (address);

  function renounceManagement() external;
  
  function pushManagement( address newOwner_ ) external;
  
  function pullManagement() external;
}

contract Ownable is IOwnable {

    address internal _owner;
    address internal _newOwner;

    event OwnershipPushed(address indexed previousOwner, address indexed newOwner);
    event OwnershipPulled(address indexed previousOwner, address indexed newOwner);

    constructor () {
        _owner = msg.sender;
        emit OwnershipPushed( address(0), _owner );
    }

    function manager() public view override returns (address) {
        return _owner;
    }

    modifier onlyManager() {
        require( _owner == msg.sender, "Ownable: caller is not the owner" );
        _;
    }

    function renounceManagement() public virtual override onlyManager() {
        emit OwnershipPushed( _owner, address(0) );
        _owner = address(0);
    }

    function pushManagement( address newOwner_ ) public virtual override onlyManager() {
        require( newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipPushed( _owner, newOwner_ );
        _newOwner = newOwner_;
    }
    
    function pullManagement() public virtual override {
        require( msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled( _owner, _newOwner );
        _owner = _newOwner;
    }
}

interface IERC20 {
    function decimals() external view returns (uint8);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function approve(address spender, uint256 amount) external returns (bool);

    function totalSupply() external view returns (uint256);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

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

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

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        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");
        }
    }
}

interface IERC20Mintable {
  function mint( uint256 amount_ ) external;

  function mint( address account_, uint256 ammount_ ) external;
}

interface IBTRFLYERC20 {
    function burnFrom(address account_, uint256 amount_) external;
}

interface IBondCalculator {
  function valuation( address pair_, uint amount_ ) external view returns ( uint _value );
}

contract REDACTEDTreasury is Ownable {

    using SafeMath for uint;
    using SafeERC20 for IERC20;

    event Deposit( address indexed token, uint amount, uint value );
    event Simp( address indexed token, uint amount, address niceGuy);
    event Withdrawal( address indexed token, uint amount, uint value );
    event CreateDebt( address indexed debtor, address indexed token, uint amount, uint value );
    event RepayDebt( address indexed debtor, address indexed token, uint amount, uint value );
    event ReservesManaged( address indexed token, uint amount );
    event ReservesUpdated( uint indexed totalReserves );
    event ReservesAudited( uint indexed totalReserves );
    event RewardsMinted( address indexed caller, address indexed recipient, uint amount );
    event ChangeQueued( MANAGING indexed managing, address queued );
    event ChangeActivated( MANAGING indexed managing, address activated, bool result );
    event tokenValueSet(address token, uint value);

    enum MANAGING { RESERVEDEPOSITOR, RESERVESPENDER, RESERVETOKEN, RESERVEMANAGER, LIQUIDITYDEPOSITOR, LIQUIDITYTOKEN, LIQUIDITYMANAGER, DEBTOR, REWARDMANAGER, SBTRFLY }

    address public immutable BTRFLY;
    uint public blocksNeededForQueue;
    
    uint public immutable newBlocksNeededForQueue;

    address[] public reserveTokens; // Push only, beware false-positives.
    mapping( address => bool ) public isReserveToken;
    mapping( address => uint ) public reserveTokenQueue; // Delays changes to mapping.
    mapping( address => uint)  public nativeFloorPrice; // With 9 decimals of precision

    address[] public reserveDepositors; // Push only, beware false-positives. Only for viewing.
    mapping( address => bool ) public isReserveDepositor;
    mapping( address => uint ) public reserveDepositorQueue; // Delays changes to mapping.

    address[] public reserveSpenders; // Push only, beware false-positives. Only for viewing.
    mapping( address => bool ) public isReserveSpender;
    mapping( address => uint ) public reserveSpenderQueue; // Delays changes to mapping.

    address[] public liquidityTokens; // Push only, beware false-positives.
    mapping( address => bool ) public isLiquidityToken;
    mapping( address => uint ) public LiquidityTokenQueue; // Delays changes to mapping.

    address[] public liquidityDepositors; // Push only, beware false-positives. Only for viewing.
    mapping( address => bool ) public isLiquidityDepositor;
    mapping( address => uint ) public LiquidityDepositorQueue; // Delays changes to mapping.

    mapping( address => address ) public bondCalculator; // bond calculator for liquidity token

    address[] public reserveManagers; // Push only, beware false-positives. Only for viewing.
    mapping( address => bool ) public isReserveManager;
    mapping( address => uint ) public ReserveManagerQueue; // Delays changes to mapping.

    address[] public liquidityManagers; // Push only, beware false-positives. Only for viewing.
    mapping( address => bool ) public isLiquidityManager;
    mapping( address => uint ) public LiquidityManagerQueue; // Delays changes to mapping.

    address[] public debtors; // Push only, beware false-positives. Only for viewing.
    mapping( address => bool ) public isDebtor;
    mapping( address => uint ) public debtorQueue; // Delays changes to mapping.
    mapping( address => uint ) public debtorBalance;

    address[] public rewardManagers; // Push only, beware false-positives. Only for viewing.
    mapping( address => bool ) public isRewardManager;
    mapping( address => uint ) public rewardManagerQueue; // Delays changes to mapping.

    address public sBTRFLY;
    uint public sBTRFLYQueue; // Delays change to sBTRFLY address
    
    uint public totalReserves; // Risk-free value of all assets
    uint public totalDebt;

    constructor (
        address _BTRFLY,
        address _OHM,
        address _sOHM,
        address _CVX,
        address _CRV,
        uint _OHMFloor,
        uint _CVXFloor,
        uint _CRVFloor,
        uint _newBlocksNeededForQueue
    ) {
        require( _BTRFLY != address(0) );
        BTRFLY = _BTRFLY;

        isReserveToken[ _OHM ] = true;
        reserveTokens.push( _OHM );
        nativeFloorPrice[ _OHM ] = _OHMFloor;

        isReserveToken[ _sOHM ] = true;
        reserveTokens.push( _sOHM );
        nativeFloorPrice[ _OHM ] = _OHMFloor;

        isReserveToken[ _CVX] = true;
        reserveTokens.push( _CVX );
        nativeFloorPrice[ _CVX ] = _CVXFloor;

        isReserveToken[ _CRV] = true;
        reserveTokens.push( _CRV );
        nativeFloorPrice[ _CRV ] = _CRVFloor;

        blocksNeededForQueue = 0;
        newBlocksNeededForQueue = _newBlocksNeededForQueue;
    }

    function deactivateAndreMode() external onlyManager(){
        blocksNeededForQueue = newBlocksNeededForQueue;
    }

    /**
        @notice allow approved address to deposit an asset for BTRFLY
        @param _amount uint
        @param _token address
        @param _profit uint
        @return send_ uint
     */
    function deposit( uint _amount, address _token, uint _profit ) external returns ( uint send_ ) {
        require( isReserveToken[ _token ] || isLiquidityToken[ _token ], "Not accepted" );
        IERC20( _token ).safeTransferFrom( msg.sender, address(this), _amount );

        if ( isReserveToken[ _token ] ) {
            require( isReserveDepositor[ msg.sender ], "Not approved" );
        } else {
            require( isLiquidityDepositor[ msg.sender ], "Not approved" );
        }

        uint value = valueOf(_token, _amount);
        // mint BTRFLY needed and store amount of rewards for distribution
        send_ = value.sub( _profit );
        IERC20Mintable( BTRFLY ).mint( msg.sender, send_ );

        totalReserves = totalReserves.add( value );
        emit ReservesUpdated( totalReserves );

        emit Deposit( _token, _amount, value );
    }

    function simp(uint _amount, address _token) external{
        require( isReserveToken[ _token ] || isLiquidityToken[ _token ], "Not accepted" );
        IERC20( _token ).safeTransferFrom( msg.sender, address(this), _amount );
        uint value = valueOf(_token, _amount);
        totalReserves = totalReserves.add( value );
        emit ReservesUpdated( totalReserves );
        emit Simp(_token,_amount,msg.sender);
    }

    /**
        @notice allow approved address to burn BTRFLY for reserves
        @param _amount uint
        @param _token address
     */
    function withdraw( uint _amount, address _token ) external {
        require( isReserveToken[ _token ], "Not accepted" ); // Only reserves can be used for redemptions
        require( isReserveSpender[ msg.sender ] == true, "Not approved" );

        uint value = valueOf( _token, _amount );
        IBTRFLYERC20( BTRFLY ).burnFrom( msg.sender, value );

        totalReserves = totalReserves.sub( value );
        emit ReservesUpdated( totalReserves );

        IERC20( _token ).safeTransfer( msg.sender, _amount );

        emit Withdrawal( _token, _amount, value );
    }

    /**
        @notice allow approved address to borrow reserves
        @param _amount uint
        @param _token address
     */
    function incurDebt( uint _amount, address _token ) external {
        require( isDebtor[ msg.sender ], "Not approved" );
        require( isReserveToken[ _token ], "Not accepted" );

        uint value = valueOf( _token, _amount );

        uint maximumDebt = IERC20( sBTRFLY ).balanceOf( msg.sender ); // Can only borrow against sBTRFLY held
        uint availableDebt = maximumDebt.sub( debtorBalance[ msg.sender ] );
        require( value <= availableDebt, "Exceeds debt limit" );

        debtorBalance[ msg.sender ] = debtorBalance[ msg.sender ].add( value );
        totalDebt = totalDebt.add( value );

        totalReserves = totalReserves.sub( value );
        emit ReservesUpdated( totalReserves );

        IERC20( _token ).transfer( msg.sender, _amount );
        
        emit CreateDebt( msg.sender, _token, _amount, value );
    }

    /**
        @notice allow approved address to repay borrowed reserves with reserves
        @param _amount uint
        @param _token address
     */
    function repayDebtWithReserve( uint _amount, address _token ) external {
        require( isDebtor[ msg.sender ], "Not approved" );
        require( isReserveToken[ _token ], "Not accepted" );

        IERC20( _token ).safeTransferFrom( msg.sender, address(this), _amount );

        uint value = valueOf( _token, _amount );
        debtorBalance[ msg.sender ] = debtorBalance[ msg.sender ].sub( value );
        totalDebt = totalDebt.sub( value );

        totalReserves = totalReserves.add( value );
        emit ReservesUpdated( totalReserves );

        emit RepayDebt( msg.sender, _token, _amount, value );
    }

    /**
        @notice allow approved address to repay borrowed reserves with BTRFLY
        @param _amount uint
     */
    function repayDebtWithBTRFLY( uint _amount ) external {
        require( isDebtor[ msg.sender ], "Not approved" );

        IBTRFLYERC20( BTRFLY ).burnFrom( msg.sender, _amount );

        debtorBalance[ msg.sender ] = debtorBalance[ msg.sender ].sub( _amount );
        totalDebt = totalDebt.sub( _amount );

        emit RepayDebt( msg.sender, BTRFLY, _amount, _amount );
    }

    /**
        @notice allow approved address to withdraw assets
        @param _token address
        @param _amount uint
     */
    function manage( address _token, uint _amount ) external {
        if( isLiquidityToken[ _token ] ) {
            require( isLiquidityManager[ msg.sender ], "Not approved" );
        } else {
            require( isReserveManager[ msg.sender ], "Not approved" );
        }

        uint value = valueOf(_token, _amount);
        require( value <= excessReserves(), "Insufficient reserves" );

        totalReserves = totalReserves.sub( value );
        emit ReservesUpdated( totalReserves );

        IERC20( _token ).safeTransfer( msg.sender, _amount );

        emit ReservesManaged( _token, _amount );
    }

    /**
        @notice send epoch reward to staking contract
     */
    function mintRewards( address _recipient, uint _amount ) external {
        require( isRewardManager[ msg.sender ], "Not approved" );
        require( _amount <= excessReserves(), "Insufficient reserves" );

        IERC20Mintable( BTRFLY ).mint( _recipient, _amount );

        emit RewardsMinted( msg.sender, _recipient, _amount );
    } 

    /**
        @notice returns excess reserves not backing tokens
        @return uint
     */
    function excessReserves() public view returns ( uint ) {
        return totalReserves.sub( IERC20( BTRFLY ).totalSupply().sub( totalDebt ) );
    }

    /**
        @notice takes inventory of all tracked assets
        @notice always consolidate to recognized reserves before audit
     */
    function auditReserves() external {
        uint reserves;
        for( uint i = 0; i < reserveTokens.length; i++ ) {
            reserves = reserves.add ( 
                valueOf( reserveTokens[ i ], IERC20( reserveTokens[ i ] ).balanceOf( address(this) ) )
            );
        }
        for( uint i = 0; i < liquidityTokens.length; i++ ) {
            reserves = reserves.add (
                valueOf( liquidityTokens[ i ], IERC20( liquidityTokens[ i ] ).balanceOf( address(this) ) )
            );
        }
        totalReserves = reserves;
        emit ReservesUpdated( reserves );
        emit ReservesAudited( reserves );
    }

    /**
        @notice returns BTRFLY valuation of asset
        @param _token address
        @param _amount uint
        @return value_ uint
     */
    function valueOf( address _token, uint _amount ) public view returns ( uint value_ ) {
        if ( isReserveToken[ _token ] ) {
            // convert amount to match BTRFLY decimals and divide by number of tokens for 1 BTRFLY
            value_ = _amount.mul( 10 ** IERC20( BTRFLY ).decimals() ).div( 10 ** IERC20( _token ).decimals() ).mul(10 ** 9).div(nativeFloorPrice[_token]);
        } else if ( isLiquidityToken[ _token ] ) {
            value_ = IBondCalculator( bondCalculator[ _token ] ).valuation( _token, _amount );
        }
    }

    /**
        @notice sets BTRFLY valuation of asset
        @param _token address
        @param _value uint
     */
     function setFloor( address _token, uint _value ) external onlyManager() {
        require(nativeFloorPrice[_token] == 0, "Token floor value can only be set once");
        nativeFloorPrice[_token] = _value;
        emit tokenValueSet(_token, _value);
    }

    function getFloor(address _token) external view returns(uint){
        return nativeFloorPrice[_token];
    }


    /**
        @notice queue address to change boolean in mapping
        @param _managing MANAGING
        @param _address address
        @return bool
     */
    function queue( MANAGING _managing, address _address ) external onlyManager() returns ( bool ) {
        require( _address != address(0) );
        if ( _managing == MANAGING.RESERVEDEPOSITOR ) { // 0
            reserveDepositorQueue[ _address ] = block.number.add( blocksNeededForQueue );
        } else if ( _managing == MANAGING.RESERVESPENDER ) { // 1
            reserveSpenderQueue[ _address ] = block.number.add( blocksNeededForQueue );
        } else if ( _managing == MANAGING.RESERVETOKEN ) { // 2
            reserveTokenQueue[ _address ] = block.number.add( blocksNeededForQueue );
        } else if ( _managing == MANAGING.RESERVEMANAGER ) { // 3
            ReserveManagerQueue[ _address ] = block.number.add( blocksNeededForQueue.mul( 2 ) );
        } else if ( _managing == MANAGING.LIQUIDITYDEPOSITOR ) { // 4
            LiquidityDepositorQueue[ _address ] = block.number.add( blocksNeededForQueue );
        } else if ( _managing == MANAGING.LIQUIDITYTOKEN ) { // 5
            LiquidityTokenQueue[ _address ] = block.number.add( blocksNeededForQueue );
        } else if ( _managing == MANAGING.LIQUIDITYMANAGER ) { // 6
            LiquidityManagerQueue[ _address ] = block.number.add( blocksNeededForQueue.mul( 2 ) );
        } else if ( _managing == MANAGING.DEBTOR ) { // 7
            debtorQueue[ _address ] = block.number.add( blocksNeededForQueue );
        } else if ( _managing == MANAGING.REWARDMANAGER ) { // 8
            rewardManagerQueue[ _address ] = block.number.add( blocksNeededForQueue );
        } else if ( _managing == MANAGING.SBTRFLY ) { // 9
            sBTRFLYQueue = block.number.add( blocksNeededForQueue );
        } else return false;

        emit ChangeQueued( _managing, _address );
        return true;
    }

    /**
        @notice verify queue then set boolean in mapping
        @param _managing MANAGING
        @param _address address
        @param _calculator address
        @return bool
     */
    function toggle( MANAGING _managing, address _address, address _calculator ) external onlyManager() returns ( bool ) {
        require( _address != address(0) );
        bool result;
        if ( _managing == MANAGING.RESERVEDEPOSITOR ) { // 0
            if ( requirements( reserveDepositorQueue, isReserveDepositor, _address ) ) {
                reserveDepositorQueue[ _address ] = 0;
                if( !listContains( reserveDepositors, _address ) ) {
                    reserveDepositors.push( _address );
                }
            }
            result = !isReserveDepositor[ _address ];
            isReserveDepositor[ _address ] = result;
            
        } else if ( _managing == MANAGING.RESERVESPENDER ) { // 1
            if ( requirements( reserveSpenderQueue, isReserveSpender, _address ) ) {
                reserveSpenderQueue[ _address ] = 0;
                if( !listContains( reserveSpenders, _address ) ) {
                    reserveSpenders.push( _address );
                }
            }
            result = !isReserveSpender[ _address ];
            isReserveSpender[ _address ] = result;

        } else if ( _managing == MANAGING.RESERVETOKEN ) { // 2
            if ( requirements( reserveTokenQueue, isReserveToken, _address ) ) {
                reserveTokenQueue[ _address ] = 0;
                if( !listContains( reserveTokens, _address ) ) {
                    reserveTokens.push( _address );
                }
            }
            result = !isReserveToken[ _address ];
            isReserveToken[ _address ] = result;

        } else if ( _managing == MANAGING.RESERVEMANAGER ) { // 3
            if ( requirements( ReserveManagerQueue, isReserveManager, _address ) ) {
                reserveManagers.push( _address );
                ReserveManagerQueue[ _address ] = 0;
                if( !listContains( reserveManagers, _address ) ) {
                    reserveManagers.push( _address );
                }
            }
            result = !isReserveManager[ _address ];
            isReserveManager[ _address ] = result;

        } else if ( _managing == MANAGING.LIQUIDITYDEPOSITOR ) { // 4
            if ( requirements( LiquidityDepositorQueue, isLiquidityDepositor, _address ) ) {
                liquidityDepositors.push( _address );
                LiquidityDepositorQueue[ _address ] = 0;
                if( !listContains( liquidityDepositors, _address ) ) {
                    liquidityDepositors.push( _address );
                }
            }
            result = !isLiquidityDepositor[ _address ];
            isLiquidityDepositor[ _address ] = result;

        } else if ( _managing == MANAGING.LIQUIDITYTOKEN ) { // 5
            if ( requirements( LiquidityTokenQueue, isLiquidityToken, _address ) ) {
                LiquidityTokenQueue[ _address ] = 0;
                if( !listContains( liquidityTokens, _address ) ) {
                    liquidityTokens.push( _address );
                }
            }
            result = !isLiquidityToken[ _address ];
            isLiquidityToken[ _address ] = result;
            bondCalculator[ _address ] = _calculator;

        } else if ( _managing == MANAGING.LIQUIDITYMANAGER ) { // 6
            if ( requirements( LiquidityManagerQueue, isLiquidityManager, _address ) ) {
                LiquidityManagerQueue[ _address ] = 0;
                if( !listContains( liquidityManagers, _address ) ) {
                    liquidityManagers.push( _address );
                }
            }
            result = !isLiquidityManager[ _address ];
            isLiquidityManager[ _address ] = result;

        } else if ( _managing == MANAGING.DEBTOR ) { // 7
            if ( requirements( debtorQueue, isDebtor, _address ) ) {
                debtorQueue[ _address ] = 0;
                if( !listContains( debtors, _address ) ) {
                    debtors.push( _address );
                }
            }
            result = !isDebtor[ _address ];
            isDebtor[ _address ] = result;

        } else if ( _managing == MANAGING.REWARDMANAGER ) { // 8
            if ( requirements( rewardManagerQueue, isRewardManager, _address ) ) {
                rewardManagerQueue[ _address ] = 0;
                if( !listContains( rewardManagers, _address ) ) {
                    rewardManagers.push( _address );
                }
            }
            result = !isRewardManager[ _address ];
            isRewardManager[ _address ] = result;

        } else if ( _managing == MANAGING.SBTRFLY ) { // 9
            sBTRFLYQueue = 0;
            sBTRFLY = _address;
            result = true;

        } else return false;

        emit ChangeActivated( _managing, _address, result );
        return true;
    }

    /**
        @notice checks requirements and returns altered structs
        @param queue_ mapping( address => uint )
        @param status_ mapping( address => bool )
        @param _address address
        @return bool 
     */
    function requirements( 
        mapping( address => uint ) storage queue_, 
        mapping( address => bool ) storage status_, 
        address _address 
    ) internal view returns ( bool ) {
        if ( !status_[ _address ] ) {
            require( queue_[ _address ] != 0, "Must queue" );
            require( queue_[ _address ] <= block.number, "Queue not expired" );
            return true;
        } return false;
    }

    /**
        @notice checks array to ensure against duplicate
        @param _list address[]
        @param _token address
        @return bool
     */
    function listContains( address[] storage _list, address _token ) internal view returns ( bool ) {
        for( uint i = 0; i < _list.length; i++ ) {
            if( _list[ i ] == _token ) {
                return true;
            }
        }
        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_BTRFLY","type":"address"},{"internalType":"address","name":"_OHM","type":"address"},{"internalType":"address","name":"_sOHM","type":"address"},{"internalType":"address","name":"_CVX","type":"address"},{"internalType":"address","name":"_CRV","type":"address"},{"internalType":"uint256","name":"_OHMFloor","type":"uint256"},{"internalType":"uint256","name":"_CVXFloor","type":"uint256"},{"internalType":"uint256","name":"_CRVFloor","type":"uint256"},{"internalType":"uint256","name":"_newBlocksNeededForQueue","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum REDACTEDTreasury.MANAGING","name":"managing","type":"uint8"},{"indexed":false,"internalType":"address","name":"activated","type":"address"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"}],"name":"ChangeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum REDACTEDTreasury.MANAGING","name":"managing","type":"uint8"},{"indexed":false,"internalType":"address","name":"queued","type":"address"}],"name":"ChangeQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CreateDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RepayDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalReserves","type":"uint256"}],"name":"ReservesAudited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReservesManaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalReserves","type":"uint256"}],"name":"ReservesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"niceGuy","type":"address"}],"name":"Simp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"tokenValueSet","type":"event"},{"inputs":[],"name":"BTRFLY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityDepositorQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityManagerQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityTokenQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ReserveManagerQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auditReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blocksNeededForQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deactivateAndreMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtorBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtorQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"debtors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_profit","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"send_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"excessReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getFloor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"incurDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDebtor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityDepositor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveDepositor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveSpender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRewardManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityDepositors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nativeFloorPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newBlocksNeededForQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum REDACTEDTreasury.MANAGING","name":"_managing","type":"uint8"},{"internalType":"address","name":"_address","type":"address"}],"name":"queue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repayDebtWithBTRFLY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"repayDebtWithReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveDepositorQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveDepositors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveSpenderQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveSpenders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveTokenQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardManagerQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sBTRFLY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sBTRFLYQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setFloor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"simp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum REDACTEDTreasury.MANAGING","name":"_managing","type":"uint8"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"_calculator","type":"address"}],"name":"toggle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"valueOf","outputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405234801561001057600080fd5b5060405162003b7838038062003b78833981810160405261012081101561003657600080fd5b50805160208201516040808401516060850151608086015160a087015160c088015160e089015161010090990151600080546001600160a01b03191633178082559751999a989996989597949693959294929391926001600160a01b0316917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b0389166100cd57600080fd5b886001600160a01b03166080816001600160a01b031660601b815250506001600460008a6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506003889080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555083600660008a6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160046000896001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506003879080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555083600660008a6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160046000886001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506003869080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055508260066000886001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160046000876001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506003859080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055508160066000876001600160a01b03166001600160a01b031681526020019081526020016000208190555060006002819055508060a0818152505050505050505050505060805160601c60a0516137626200041660003980611b3752806126a9525080610b7b5280610f1d528061139552806114e1528061157d52806116315280611c195280611f7f52506137626000f3fe608060405234801561001057600080fd5b50600436106103825760003560e01c806387d67dff116101de578063c99c7d931161010f578063ebd83cd8116100ad578063fbfd393b1161007c578063fbfd393b14610a35578063fc7b9c1814610a6c578063fd1ec01014610a74578063fff9ee8714610a9157610382565b8063ebd83cd8146109bb578063ec7ad1a2146109e1578063ee4e19a1146109e9578063fb93958814610a0f57610382565b8063d07f390f116100e9578063d07f390f14610932578063d796ffb81461093a578063df89b34414610966578063e83afee31461098c57610382565b8063c99c7d93146108c3578063cd85641a146108ef578063d031370b1461091557610382565b8063a569e5711161017c578063b5b1d56011610156578063b5b1d56014610846578063bc157ac114610863578063c24ad43e14610895578063c81d37dd146108bb57610382565b8063a569e571146107d4578063ab319c9a146107fa578063b1bd38b01461082057610382565b80638f840ddd116101b85780638f840ddd14610778578063932cc8c3146107805780639e5722f9146107a6578063a1210a2d146107ae57610382565b806387d67dff1461070f5780638f59c727146107355780638f6a7b571461075b57610382565b8063437f7912116102b857806368c31dd51161025657806370a0502a1161023057806370a0502a14610689578063788c6c01146106a657806383f67ba4146106cc578063869871bf146106f257610382565b806368c31dd51461061a5780636a20de92146106405780636b5e40a71461066c57610382565b8063481c6a7511610292578063481c6a75146105dc5780634e83423c146105e45780635a96ac0a1461060a5780635bc42af51461061257610382565b8063437f79121461056d578063441b9e3d1461058a57806346f68ee9146105b657610382565b806312422d231161032557806322443c10116102ff57806322443c101461051a57806324793cea146105225780632a186a781461053f5780632b7ce5001461056557610382565b806312422d231461049c5780631af4da70146104c85780631eec5a9a146104ee57610382565b8063094a865111610361578063094a8651146103f65780630b0eee301461042e5780630c3513a81461045a578063124154ca1461046257610382565b8062f714ce146103875780630619aff1146103b5578063089208d8146103ee575b600080fd5b6103b36004803603604081101561039d57600080fd5b50803590602001356001600160a01b0316610ab7565b005b6103d2600480360360208110156103cb57600080fd5b5035610c8e565b604080516001600160a01b039092168252519081900360200190f35b6103b3610cb8565b61041c6004803603602081101561040c57600080fd5b50356001600160a01b0316610d4f565b60408051918252519081900360200190f35b6103b36004803603604081101561044457600080fd5b506001600160a01b038135169060200135610d61565b61041c610f10565b6104886004803603602081101561047857600080fd5b50356001600160a01b0316610fb4565b604080519115158252519081900360200190f35b6103b3600480360360408110156104b257600080fd5b50803590602001356001600160a01b0316610fc9565b6103d2600480360360208110156104de57600080fd5b50356001600160a01b0316611299565b61041c6004803603604081101561050457600080fd5b506001600160a01b0381351690602001356112b4565b6103d26114df565b6103b36004803603602081101561053857600080fd5b5035611503565b61041c6004803603602081101561055557600080fd5b50356001600160a01b0316611682565b6103b3611694565b6103d26004803603602081101561058357600080fd5b503561180a565b6103b3600480360360408110156105a057600080fd5b50803590602001356001600160a01b031661181a565b6103b3600480360360208110156105cc57600080fd5b50356001600160a01b031661192d565b6103d2611a1a565b610488600480360360208110156105fa57600080fd5b50356001600160a01b0316611a29565b6103b3611a3e565b6103b3611ae8565b6104886004803603602081101561063057600080fd5b50356001600160a01b0316611b5b565b6103b36004803603604081101561065657600080fd5b506001600160a01b038135169060200135611b70565b6103d26004803603602081101561068257600080fd5b5035611cea565b6103d26004803603602081101561069f57600080fd5b5035611cfa565b61041c600480360360208110156106bc57600080fd5b50356001600160a01b0316611d0a565b61041c600480360360208110156106e257600080fd5b50356001600160a01b0316611d1c565b6103d26004803603602081101561070857600080fd5b5035611d37565b6104886004803603602081101561072557600080fd5b50356001600160a01b0316611d47565b61041c6004803603602081101561074b57600080fd5b50356001600160a01b0316611d5c565b6103d26004803603602081101561077157600080fd5b5035611d6e565b61041c611d7e565b61041c6004803603602081101561079657600080fd5b50356001600160a01b0316611d84565b6103d2611d96565b610488600480360360208110156107c457600080fd5b50356001600160a01b0316611da5565b610488600480360360208110156107ea57600080fd5b50356001600160a01b0316611dba565b61041c6004803603602081101561081057600080fd5b50356001600160a01b0316611dcf565b61041c6004803603602081101561083657600080fd5b50356001600160a01b0316611de1565b6103d26004803603602081101561085c57600080fd5b5035611df3565b61041c6004803603606081101561087957600080fd5b508035906001600160a01b036020820135169060400135611e03565b61041c600480360360208110156108ab57600080fd5b50356001600160a01b0316612081565b61041c612093565b6103b3600480360360408110156108d957600080fd5b506001600160a01b038135169060200135612099565b61041c6004803603602081101561090557600080fd5b50356001600160a01b0316612194565b6103d26004803603602081101561092b57600080fd5b50356121a6565b61041c6121b6565b6103b36004803603604081101561095057600080fd5b50803590602001356001600160a01b03166121bc565b6104886004803603602081101561097c57600080fd5b50356001600160a01b031661233f565b610488600480360360408110156109a257600080fd5b50803560ff1690602001356001600160a01b0316612354565b610488600480360360208110156109d157600080fd5b50356001600160a01b0316612692565b61041c6126a7565b610488600480360360208110156109ff57600080fd5b50356001600160a01b03166126cb565b61041c60048036036020811015610a2557600080fd5b50356001600160a01b03166126e0565b61048860048036036060811015610a4b57600080fd5b5060ff813516906001600160a01b03602082013581169160400135166126f1565b61041c612fac565b6103d260048036036020811015610a8a57600080fd5b5035612fb2565b61041c60048036036020811015610aa757600080fd5b50356001600160a01b0316612fc2565b6001600160a01b03811660009081526004602052604090205460ff16610b13576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b336000908152600b602052604090205460ff161515600114610b6b576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6000610b7782846112b4565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379cc679033836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610bf057600080fd5b505af1158015610c04573d6000803e3d6000fd5b5050602354610c169250905082612fd4565b60238190556040516000805160206136e383398151915290600090a2610c466001600160a01b0383163385613016565b604080518481526020810183905281516001600160a01b038516927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb928290030190a2505050565b60148181548110610c9e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610d05576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b601d6020526000908152604090205481565b6001600160a01b0382166000908152600e602052604090205460ff1615610dda573360009081526018602052604090205460ff16610dd5576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b610e2d565b3360009081526015602052604090205460ff16610e2d576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6000610e3983836112b4565b9050610e43610f10565b811115610e8f576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420726573657276657360581b604482015290519081900360640190fd5b602354610e9c9082612fd4565b60238190556040516000805160206136e383398151915290600090a2610ecc6001600160a01b0384163384613016565b6040805183815290516001600160a01b038516917f2bb2640731848fe9820ba48dbc978c1fc9bbd5f11b948bfab05b7dee3378fd80919081900360200190a2505050565b6000610faf610fa66024547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7457600080fd5b505afa158015610f88573d6000803e3d6000fd5b505050506040513d6020811015610f9e57600080fd5b505190612fd4565b60235490612fd4565b905090565b60086020526000908152604090205460ff1681565b336000908152601b602052604090205460ff1661101c576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff16611078576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b600061108482846112b4565b602154604080516370a0823160e01b815233600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b5051336000908152601d602052604081205491925090611120908390612fd4565b90508083111561116c576040805162461bcd60e51b8152602060048201526012602482015271115e18d959591cc81919589d081b1a5b5a5d60721b604482015290519081900360640190fd5b336000908152601d6020526040902054611186908461306d565b336000908152601d60205260409020556024546111a3908461306d565b6024556023546111b39084612fd4565b60238190556040516000805160206136e383398151915290600090a26040805163a9059cbb60e01b81523360048201526024810187905290516001600160a01b0386169163a9059cbb9160448083019260209291908290030181600087803b15801561121e57600080fd5b505af1158015611232573d6000803e3d6000fd5b505050506040513d602081101561124857600080fd5b5050604080518681526020810185905281516001600160a01b0387169233927f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d6929081900390910190a35050505050565b6013602052600090815260409020546001600160a01b031681565b6001600160a01b03821660009081526004602052604081205460ff16156114285761142160066000856001600160a01b03166001600160a01b0316815260200190815260200160002054611415633b9aca0061141b876001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561134257600080fd5b505afa158015611356573d6000803e3d6000fd5b505050506040513d602081101561136c57600080fd5b50516040805163313ce56760e01b8152905160ff909216600a0a91611415916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163313ce56791600480820192602092909190829003018186803b1580156113dc57600080fd5b505afa1580156113f0573d6000803e3d6000fd5b505050506040513d602081101561140657600080fd5b5051899060ff16600a0a6130c7565b90613120565b906130c7565b90506114d9565b6001600160a01b0383166000908152600e602052604090205460ff16156114d9576001600160a01b03808416600081815260136020908152604091829020548251634249719f60e01b815260048101949094526024840187905291519190931692634249719f9260448082019391829003018186803b1580156114aa57600080fd5b505afa1580156114be573d6000803e3d6000fd5b505050506040513d60208110156114d457600080fd5b505190505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b336000908152601b602052604090205460ff16611556576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6040805163079cc67960e41b81523360048201526024810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916379cc679091604480830192600092919082900301818387803b1580156115c457600080fd5b505af11580156115d8573d6000803e3d6000fd5b5050336000908152601d60205260409020546115f79250905082612fd4565b336000908152601d60205260409020556024546116149082612fd4565b602455604080518281526020810183905281516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a350565b60066020526000908152604090205481565b6000805b60035481101561176c5761176261175b600383815481106116b557fe5b600091825260209091200154600380546001600160a01b0390921691859081106116db57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561172a57600080fd5b505afa15801561173e573d6000803e3d6000fd5b505050506040513d602081101561175457600080fd5b50516112b4565b839061306d565b9150600101611698565b5060005b600d548110156117bd576117b361175b600d838154811061178d57fe5b600091825260209091200154600d80546001600160a01b0390921691859081106116db57fe5b9150600101611770565b50602381905560405181906000805160206136e383398151915290600090a260405181907fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446690600090a250565b600a8181548110610c9e57600080fd5b6001600160a01b03811660009081526004602052604090205460ff168061185957506001600160a01b0381166000908152600e602052604090205460ff165b611899576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b6118ae6001600160a01b038216333085613162565b60006118ba82846112b4565b6023549091506118ca908261306d565b60238190556040516000805160206136e383398151915290600090a26040805184815233602082015281516001600160a01b038516927f74af5e21416172c4018da0bd43190a10fbb3f7901101907929a85a069d9e4f94928290030190a2505050565b6000546001600160a01b0316331461197a576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b0381166119bf5760405162461bcd60e51b81526004018080602001828103825260268152602001806136346026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b601f6020526000908152604090205460ff1681565b6001546001600160a01b03163314611a875760405162461bcd60e51b815260040180806020018281038252602281526020018061365a6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000546001600160a01b03163314611b35576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000600255565b60046020526000908152604090205460ff1681565b336000908152601f602052604090205460ff16611bc3576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b611bcb610f10565b811115611c17576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420726573657276657360581b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507ffa8ccab40e7da8146c2304cd0950334fd30a6ba093abe86261aa13911fed849c9181900360200190a35050565b60078181548110610c9e57600080fd5b60178181548110610c9e57600080fd5b60056020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b601a8181548110610c9e57600080fd5b600b6020526000908152604090205460ff1681565b600f6020526000908152604090205481565b60108181548110610c9e57600080fd5b60235481565b60096020526000908152604090205481565b6021546001600160a01b031681565b60116020526000908152604090205460ff1681565b600e6020526000908152604090205460ff1681565b60196020526000908152604090205481565b60166020526000908152604090205481565b601e8181548110610c9e57600080fd5b6001600160a01b03821660009081526004602052604081205460ff1680611e4257506001600160a01b0383166000908152600e602052604090205460ff165b611e82576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b611e976001600160a01b038416333087613162565b6001600160a01b03831660009081526004602052604090205460ff1615611f10573360009081526008602052604090205460ff16611f0b576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b611f63565b3360009081526011602052604090205460ff16611f63576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6000611f6f84866112b4565b9050611f7b8184612fd4565b91507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1933846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ff457600080fd5b505af1158015612008573d6000803e3d6000fd5b505060235461201a925090508261306d565b60238190556040516000805160206136e383398151915290600090a2604080518681526020810183905281516001600160a01b038716927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2509392505050565b600c6020526000908152604090205481565b60225481565b6000546001600160a01b031633146120e6576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600660205260409020541561213b5760405162461bcd60e51b815260040180806020018281038252602681526020018061367c6026913960400191505060405180910390fd5b6001600160a01b0382166000818152600660209081526040918290208490558151928352820183905280517f3338cd46289b179104f17582d19068f0b9dacabfc55ef6e4e98f1df99d5165fb9281900390910190a15050565b601c6020526000908152604090205481565b60038181548110610c9e57600080fd5b60025481565b336000908152601b602052604090205460ff1661220f576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff1661226b576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b6122806001600160a01b038216333085613162565b600061228c82846112b4565b336000908152601d60205260409020549091506122a99082612fd4565b336000908152601d60205260409020556024546122c69082612fd4565b6024556023546122d6908261306d565b60238190556040516000805160206136e383398151915290600090a2604080518481526020810183905281516001600160a01b0385169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a3505050565b60186020526000908152604090205460ff1681565b600080546001600160a01b031633146123a2576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b0382166123b557600080fd5b60008360098111156123c357fe5b14156123f5576002546123d790439061306d565b6001600160a01b038316600090815260096020526040902055612641565b600183600981111561240357fe5b14156124355760025461241790439061306d565b6001600160a01b0383166000908152600c6020526040902055612641565b600283600981111561244357fe5b14156124755760025461245790439061306d565b6001600160a01b038316600090815260056020526040902055612641565b600383600981111561248357fe5b14156124c6576124a86124a1600280546130c790919063ffffffff16565b439061306d565b6001600160a01b038316600090815260166020526040902055612641565b60048360098111156124d457fe5b1415612506576002546124e890439061306d565b6001600160a01b038316600090815260126020526040902055612641565b600583600981111561251457fe5b14156125465760025461252890439061306d565b6001600160a01b0383166000908152600f6020526040902055612641565b600683600981111561255457fe5b1415612590576125726124a1600280546130c790919063ffffffff16565b6001600160a01b038316600090815260196020526040902055612641565b600783600981111561259e57fe5b14156125d0576002546125b290439061306d565b6001600160a01b0383166000908152601c6020526040902055612641565b60088360098111156125de57fe5b141561260f576002546125f290439061306d565b6001600160a01b0383166000908152602080526040902055612641565b600983600981111561261d57fe5b14156126395760025461263190439061306d565b602255612641565b5060006114d9565b82600981111561264d57fe5b604080516001600160a01b038516815290517f0e4f2c4b5bc209d509bc3d49348c787fefadc66a79351b470599ac0f5be52eaf9181900360200190a250600192915050565b60156020526000908152604090205460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b601b6020526000908152604090205460ff1681565b602080526000908152604090205481565b600080546001600160a01b0316331461273f576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b03831661275257600080fd5b60008085600981111561276157fe5b141561281d5761277460096008866131c2565b156127ed576001600160a01b03841660009081526009602052604081205561279d6007856132ac565b6127ed57600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600860205260409020805460ff81161560ff199091168117909155612f4e565b600185600981111561282b57fe5b14156128e75761283e600c600b866131c2565b156128b7576001600160a01b0384166000908152600c6020526040812055612867600a856132ac565b6128b757600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600b60205260409020805460ff81161560ff199091168117909155612f4e565b60028560098111156128f557fe5b14156129b15761290860056004866131c2565b15612981576001600160a01b0384166000908152600560205260408120556129316003856132ac565b61298157600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600460205260409020805460ff81161560ff199091168117909155612f4e565b60038560098111156129bf57fe5b1415612ab8576129d260166015866131c2565b15612a8857601480546001810182557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319166001600160a01b038716908117909155600090815260166020526040812055612a3890856132ac565b612a8857601480546001810182556000919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601560205260409020805460ff81161560ff199091168117909155612f4e565b6004856009811115612ac657fe5b1415612bbf57612ad960126011866131c2565b15612b8f57601080546001810182557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b038716908117909155600090815260126020526040812055612b3f90856132ac565b612b8f57601080546001810182556000919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601160205260409020805460ff81161560ff199091168117909155612f4e565b6005856009811115612bcd57fe5b1415612cab57612be0600f600e866131c2565b15612c59576001600160a01b0384166000908152600f6020526040812055612c09600d856132ac565b612c5957600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b038381166000908152600e60209081526040808320805460ff81161560ff199091168117909155601390925290912080546001600160a01b03191692851692909217909155612f4e565b6006856009811115612cb957fe5b1415612d7557612ccc60196018866131c2565b15612d45576001600160a01b038416600090815260196020526040812055612cf56017856132ac565b612d4557601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601860205260409020805460ff81161560ff199091168117909155612f4e565b6007856009811115612d8357fe5b1415612e3f57612d96601c601b866131c2565b15612e0f576001600160a01b0384166000908152601c6020526040812055612dbf601a856132ac565b612e0f57601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601b60205260409020805460ff81161560ff199091168117909155612f4e565b6008856009811115612e4d57fe5b1415612f0857612e606020601f866131c2565b15612ed8576001600160a01b0384166000908152602080526040812055612e88601e856132ac565b612ed857601e80546001810182556000919091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601f60205260409020805460ff81161560ff199091168117909155612f4e565b6009856009811115612f1657fe5b1415612f4457506000602255602180546001600160a01b0319166001600160a01b0385161790556001612f4e565b6000915050612fa5565b846009811115612f5a57fe5b604080516001600160a01b0387168152831515602082015281517f0dcacb7e392f3d6a216ed2660e3dcfd40b7793d33591db2ba185a6b8e44fc477929181900390910190a260019150505b9392505050565b60245481565b600d8181548110610c9e57600080fd5b60126020526000908152604090205481565b6000612fa583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506132fc565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613068908490613393565b505050565b600082820183811015612fa5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826130d6575060006114d9565b828202828482816130e357fe5b0414612fa55760405162461bcd60e51b81526004018080602001828103825260218152602001806136a26021913960400191505060405180910390fd5b6000612fa583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613444565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526131bc908590613393565b50505050565b6001600160a01b03811660009081526020839052604081205460ff166132a2576001600160a01b038216600090815260208590526040902054613239576040805162461bcd60e51b815260206004820152600a6024820152694d75737420717565756560b01b604482015290519081900360640190fd5b6001600160a01b03821660009081526020859052604090205443101561329a576040805162461bcd60e51b8152602060048201526011602482015270145d595d59481b9bdd08195e1c1a5c9959607a1b604482015290519081900360640190fd5b506001612fa5565b5060009392505050565b6000805b83548110156132a257826001600160a01b03168482815481106132cf57fe5b6000918252602090912001546001600160a01b031614156132f45760019150506114d9565b6001016132b0565b6000818484111561338b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613350578181015183820152602001613338565b50505050905090810190601f16801561337d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60606133e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134a99092919063ffffffff16565b8051909150156130685780806020019051602081101561340757600080fd5b50516130685760405162461bcd60e51b815260040180806020018281038252602a815260200180613703602a913960400191505060405180910390fd5b600081836134935760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613350578181015183820152602001613338565b50600083858161349f57fe5b0495945050505050565b60606134b884846000856134c0565b949350505050565b60606134cb8561362d565b61351c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061355b5780518252601f19909201916020918201910161353c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146135bd576040519150601f19603f3d011682016040523d82523d6000602084013e6135c2565b606091505b509150915081156135d65791506134b89050565b8051156135e65780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315613350578181015183820152602001613338565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c546f6b656e20666c6f6f722076616c75652063616e206f6e6c7920626520736574206f6e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657293bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d665361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220138383546aae90fd6ee919ba3a41d500524c5144e52d8564f795ce5324cc7ea564736f6c63430007050033000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d500000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd4600000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5200000000000000000000000000000000000000000000000000000000002625a00000000000000000000000000000000000000000000000000000000001dcd650000000000000000000000000000000000000000000000000000000000ee6b2800000000000000000000000000000000000000000000000000000000000000ce5

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103825760003560e01c806387d67dff116101de578063c99c7d931161010f578063ebd83cd8116100ad578063fbfd393b1161007c578063fbfd393b14610a35578063fc7b9c1814610a6c578063fd1ec01014610a74578063fff9ee8714610a9157610382565b8063ebd83cd8146109bb578063ec7ad1a2146109e1578063ee4e19a1146109e9578063fb93958814610a0f57610382565b8063d07f390f116100e9578063d07f390f14610932578063d796ffb81461093a578063df89b34414610966578063e83afee31461098c57610382565b8063c99c7d93146108c3578063cd85641a146108ef578063d031370b1461091557610382565b8063a569e5711161017c578063b5b1d56011610156578063b5b1d56014610846578063bc157ac114610863578063c24ad43e14610895578063c81d37dd146108bb57610382565b8063a569e571146107d4578063ab319c9a146107fa578063b1bd38b01461082057610382565b80638f840ddd116101b85780638f840ddd14610778578063932cc8c3146107805780639e5722f9146107a6578063a1210a2d146107ae57610382565b806387d67dff1461070f5780638f59c727146107355780638f6a7b571461075b57610382565b8063437f7912116102b857806368c31dd51161025657806370a0502a1161023057806370a0502a14610689578063788c6c01146106a657806383f67ba4146106cc578063869871bf146106f257610382565b806368c31dd51461061a5780636a20de92146106405780636b5e40a71461066c57610382565b8063481c6a7511610292578063481c6a75146105dc5780634e83423c146105e45780635a96ac0a1461060a5780635bc42af51461061257610382565b8063437f79121461056d578063441b9e3d1461058a57806346f68ee9146105b657610382565b806312422d231161032557806322443c10116102ff57806322443c101461051a57806324793cea146105225780632a186a781461053f5780632b7ce5001461056557610382565b806312422d231461049c5780631af4da70146104c85780631eec5a9a146104ee57610382565b8063094a865111610361578063094a8651146103f65780630b0eee301461042e5780630c3513a81461045a578063124154ca1461046257610382565b8062f714ce146103875780630619aff1146103b5578063089208d8146103ee575b600080fd5b6103b36004803603604081101561039d57600080fd5b50803590602001356001600160a01b0316610ab7565b005b6103d2600480360360208110156103cb57600080fd5b5035610c8e565b604080516001600160a01b039092168252519081900360200190f35b6103b3610cb8565b61041c6004803603602081101561040c57600080fd5b50356001600160a01b0316610d4f565b60408051918252519081900360200190f35b6103b36004803603604081101561044457600080fd5b506001600160a01b038135169060200135610d61565b61041c610f10565b6104886004803603602081101561047857600080fd5b50356001600160a01b0316610fb4565b604080519115158252519081900360200190f35b6103b3600480360360408110156104b257600080fd5b50803590602001356001600160a01b0316610fc9565b6103d2600480360360208110156104de57600080fd5b50356001600160a01b0316611299565b61041c6004803603604081101561050457600080fd5b506001600160a01b0381351690602001356112b4565b6103d26114df565b6103b36004803603602081101561053857600080fd5b5035611503565b61041c6004803603602081101561055557600080fd5b50356001600160a01b0316611682565b6103b3611694565b6103d26004803603602081101561058357600080fd5b503561180a565b6103b3600480360360408110156105a057600080fd5b50803590602001356001600160a01b031661181a565b6103b3600480360360208110156105cc57600080fd5b50356001600160a01b031661192d565b6103d2611a1a565b610488600480360360208110156105fa57600080fd5b50356001600160a01b0316611a29565b6103b3611a3e565b6103b3611ae8565b6104886004803603602081101561063057600080fd5b50356001600160a01b0316611b5b565b6103b36004803603604081101561065657600080fd5b506001600160a01b038135169060200135611b70565b6103d26004803603602081101561068257600080fd5b5035611cea565b6103d26004803603602081101561069f57600080fd5b5035611cfa565b61041c600480360360208110156106bc57600080fd5b50356001600160a01b0316611d0a565b61041c600480360360208110156106e257600080fd5b50356001600160a01b0316611d1c565b6103d26004803603602081101561070857600080fd5b5035611d37565b6104886004803603602081101561072557600080fd5b50356001600160a01b0316611d47565b61041c6004803603602081101561074b57600080fd5b50356001600160a01b0316611d5c565b6103d26004803603602081101561077157600080fd5b5035611d6e565b61041c611d7e565b61041c6004803603602081101561079657600080fd5b50356001600160a01b0316611d84565b6103d2611d96565b610488600480360360208110156107c457600080fd5b50356001600160a01b0316611da5565b610488600480360360208110156107ea57600080fd5b50356001600160a01b0316611dba565b61041c6004803603602081101561081057600080fd5b50356001600160a01b0316611dcf565b61041c6004803603602081101561083657600080fd5b50356001600160a01b0316611de1565b6103d26004803603602081101561085c57600080fd5b5035611df3565b61041c6004803603606081101561087957600080fd5b508035906001600160a01b036020820135169060400135611e03565b61041c600480360360208110156108ab57600080fd5b50356001600160a01b0316612081565b61041c612093565b6103b3600480360360408110156108d957600080fd5b506001600160a01b038135169060200135612099565b61041c6004803603602081101561090557600080fd5b50356001600160a01b0316612194565b6103d26004803603602081101561092b57600080fd5b50356121a6565b61041c6121b6565b6103b36004803603604081101561095057600080fd5b50803590602001356001600160a01b03166121bc565b6104886004803603602081101561097c57600080fd5b50356001600160a01b031661233f565b610488600480360360408110156109a257600080fd5b50803560ff1690602001356001600160a01b0316612354565b610488600480360360208110156109d157600080fd5b50356001600160a01b0316612692565b61041c6126a7565b610488600480360360208110156109ff57600080fd5b50356001600160a01b03166126cb565b61041c60048036036020811015610a2557600080fd5b50356001600160a01b03166126e0565b61048860048036036060811015610a4b57600080fd5b5060ff813516906001600160a01b03602082013581169160400135166126f1565b61041c612fac565b6103d260048036036020811015610a8a57600080fd5b5035612fb2565b61041c60048036036020811015610aa757600080fd5b50356001600160a01b0316612fc2565b6001600160a01b03811660009081526004602052604090205460ff16610b13576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b336000908152600b602052604090205460ff161515600114610b6b576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6000610b7782846112b4565b90507f000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a6001600160a01b03166379cc679033836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610bf057600080fd5b505af1158015610c04573d6000803e3d6000fd5b5050602354610c169250905082612fd4565b60238190556040516000805160206136e383398151915290600090a2610c466001600160a01b0383163385613016565b604080518481526020810183905281516001600160a01b038516927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb928290030190a2505050565b60148181548110610c9e57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610d05576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b601d6020526000908152604090205481565b6001600160a01b0382166000908152600e602052604090205460ff1615610dda573360009081526018602052604090205460ff16610dd5576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b610e2d565b3360009081526015602052604090205460ff16610e2d576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6000610e3983836112b4565b9050610e43610f10565b811115610e8f576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420726573657276657360581b604482015290519081900360640190fd5b602354610e9c9082612fd4565b60238190556040516000805160206136e383398151915290600090a2610ecc6001600160a01b0384163384613016565b6040805183815290516001600160a01b038516917f2bb2640731848fe9820ba48dbc978c1fc9bbd5f11b948bfab05b7dee3378fd80919081900360200190a2505050565b6000610faf610fa66024547f000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7457600080fd5b505afa158015610f88573d6000803e3d6000fd5b505050506040513d6020811015610f9e57600080fd5b505190612fd4565b60235490612fd4565b905090565b60086020526000908152604090205460ff1681565b336000908152601b602052604090205460ff1661101c576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff16611078576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b600061108482846112b4565b602154604080516370a0823160e01b815233600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156110d557600080fd5b505afa1580156110e9573d6000803e3d6000fd5b505050506040513d60208110156110ff57600080fd5b5051336000908152601d602052604081205491925090611120908390612fd4565b90508083111561116c576040805162461bcd60e51b8152602060048201526012602482015271115e18d959591cc81919589d081b1a5b5a5d60721b604482015290519081900360640190fd5b336000908152601d6020526040902054611186908461306d565b336000908152601d60205260409020556024546111a3908461306d565b6024556023546111b39084612fd4565b60238190556040516000805160206136e383398151915290600090a26040805163a9059cbb60e01b81523360048201526024810187905290516001600160a01b0386169163a9059cbb9160448083019260209291908290030181600087803b15801561121e57600080fd5b505af1158015611232573d6000803e3d6000fd5b505050506040513d602081101561124857600080fd5b5050604080518681526020810185905281516001600160a01b0387169233927f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d6929081900390910190a35050505050565b6013602052600090815260409020546001600160a01b031681565b6001600160a01b03821660009081526004602052604081205460ff16156114285761142160066000856001600160a01b03166001600160a01b0316815260200190815260200160002054611415633b9aca0061141b876001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561134257600080fd5b505afa158015611356573d6000803e3d6000fd5b505050506040513d602081101561136c57600080fd5b50516040805163313ce56760e01b8152905160ff909216600a0a91611415916001600160a01b037f000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a169163313ce56791600480820192602092909190829003018186803b1580156113dc57600080fd5b505afa1580156113f0573d6000803e3d6000fd5b505050506040513d602081101561140657600080fd5b5051899060ff16600a0a6130c7565b90613120565b906130c7565b90506114d9565b6001600160a01b0383166000908152600e602052604090205460ff16156114d9576001600160a01b03808416600081815260136020908152604091829020548251634249719f60e01b815260048101949094526024840187905291519190931692634249719f9260448082019391829003018186803b1580156114aa57600080fd5b505afa1580156114be573d6000803e3d6000fd5b505050506040513d60208110156114d457600080fd5b505190505b92915050565b7f000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a81565b336000908152601b602052604090205460ff16611556576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6040805163079cc67960e41b81523360048201526024810183905290516001600160a01b037f000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a16916379cc679091604480830192600092919082900301818387803b1580156115c457600080fd5b505af11580156115d8573d6000803e3d6000fd5b5050336000908152601d60205260409020546115f79250905082612fd4565b336000908152601d60205260409020556024546116149082612fd4565b602455604080518281526020810183905281516001600160a01b037f000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a350565b60066020526000908152604090205481565b6000805b60035481101561176c5761176261175b600383815481106116b557fe5b600091825260209091200154600380546001600160a01b0390921691859081106116db57fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561172a57600080fd5b505afa15801561173e573d6000803e3d6000fd5b505050506040513d602081101561175457600080fd5b50516112b4565b839061306d565b9150600101611698565b5060005b600d548110156117bd576117b361175b600d838154811061178d57fe5b600091825260209091200154600d80546001600160a01b0390921691859081106116db57fe5b9150600101611770565b50602381905560405181906000805160206136e383398151915290600090a260405181907fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446690600090a250565b600a8181548110610c9e57600080fd5b6001600160a01b03811660009081526004602052604090205460ff168061185957506001600160a01b0381166000908152600e602052604090205460ff165b611899576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b6118ae6001600160a01b038216333085613162565b60006118ba82846112b4565b6023549091506118ca908261306d565b60238190556040516000805160206136e383398151915290600090a26040805184815233602082015281516001600160a01b038516927f74af5e21416172c4018da0bd43190a10fbb3f7901101907929a85a069d9e4f94928290030190a2505050565b6000546001600160a01b0316331461197a576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b0381166119bf5760405162461bcd60e51b81526004018080602001828103825260268152602001806136346026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b601f6020526000908152604090205460ff1681565b6001546001600160a01b03163314611a875760405162461bcd60e51b815260040180806020018281038252602281526020018061365a6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000546001600160a01b03163314611b35576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000ce5600255565b60046020526000908152604090205460ff1681565b336000908152601f602052604090205460ff16611bc3576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b611bcb610f10565b811115611c17576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420726573657276657360581b604482015290519081900360640190fd5b7f000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a6001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507ffa8ccab40e7da8146c2304cd0950334fd30a6ba093abe86261aa13911fed849c9181900360200190a35050565b60078181548110610c9e57600080fd5b60178181548110610c9e57600080fd5b60056020526000908152604090205481565b6001600160a01b031660009081526006602052604090205490565b601a8181548110610c9e57600080fd5b600b6020526000908152604090205460ff1681565b600f6020526000908152604090205481565b60108181548110610c9e57600080fd5b60235481565b60096020526000908152604090205481565b6021546001600160a01b031681565b60116020526000908152604090205460ff1681565b600e6020526000908152604090205460ff1681565b60196020526000908152604090205481565b60166020526000908152604090205481565b601e8181548110610c9e57600080fd5b6001600160a01b03821660009081526004602052604081205460ff1680611e4257506001600160a01b0383166000908152600e602052604090205460ff165b611e82576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b611e976001600160a01b038416333087613162565b6001600160a01b03831660009081526004602052604090205460ff1615611f10573360009081526008602052604090205460ff16611f0b576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b611f63565b3360009081526011602052604090205460ff16611f63576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6000611f6f84866112b4565b9050611f7b8184612fd4565b91507f000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a6001600160a01b03166340c10f1933846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ff457600080fd5b505af1158015612008573d6000803e3d6000fd5b505060235461201a925090508261306d565b60238190556040516000805160206136e383398151915290600090a2604080518681526020810183905281516001600160a01b038716927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2509392505050565b600c6020526000908152604090205481565b60225481565b6000546001600160a01b031633146120e6576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600660205260409020541561213b5760405162461bcd60e51b815260040180806020018281038252602681526020018061367c6026913960400191505060405180910390fd5b6001600160a01b0382166000818152600660209081526040918290208490558151928352820183905280517f3338cd46289b179104f17582d19068f0b9dacabfc55ef6e4e98f1df99d5165fb9281900390910190a15050565b601c6020526000908152604090205481565b60038181548110610c9e57600080fd5b60025481565b336000908152601b602052604090205460ff1661220f576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205460ff1661226b576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b6122806001600160a01b038216333085613162565b600061228c82846112b4565b336000908152601d60205260409020549091506122a99082612fd4565b336000908152601d60205260409020556024546122c69082612fd4565b6024556023546122d6908261306d565b60238190556040516000805160206136e383398151915290600090a2604080518481526020810183905281516001600160a01b0385169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a3505050565b60186020526000908152604090205460ff1681565b600080546001600160a01b031633146123a2576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b0382166123b557600080fd5b60008360098111156123c357fe5b14156123f5576002546123d790439061306d565b6001600160a01b038316600090815260096020526040902055612641565b600183600981111561240357fe5b14156124355760025461241790439061306d565b6001600160a01b0383166000908152600c6020526040902055612641565b600283600981111561244357fe5b14156124755760025461245790439061306d565b6001600160a01b038316600090815260056020526040902055612641565b600383600981111561248357fe5b14156124c6576124a86124a1600280546130c790919063ffffffff16565b439061306d565b6001600160a01b038316600090815260166020526040902055612641565b60048360098111156124d457fe5b1415612506576002546124e890439061306d565b6001600160a01b038316600090815260126020526040902055612641565b600583600981111561251457fe5b14156125465760025461252890439061306d565b6001600160a01b0383166000908152600f6020526040902055612641565b600683600981111561255457fe5b1415612590576125726124a1600280546130c790919063ffffffff16565b6001600160a01b038316600090815260196020526040902055612641565b600783600981111561259e57fe5b14156125d0576002546125b290439061306d565b6001600160a01b0383166000908152601c6020526040902055612641565b60088360098111156125de57fe5b141561260f576002546125f290439061306d565b6001600160a01b0383166000908152602080526040902055612641565b600983600981111561261d57fe5b14156126395760025461263190439061306d565b602255612641565b5060006114d9565b82600981111561264d57fe5b604080516001600160a01b038516815290517f0e4f2c4b5bc209d509bc3d49348c787fefadc66a79351b470599ac0f5be52eaf9181900360200190a250600192915050565b60156020526000908152604090205460ff1681565b7f0000000000000000000000000000000000000000000000000000000000000ce581565b601b6020526000908152604090205460ff1681565b602080526000908152604090205481565b600080546001600160a01b0316331461273f576040805162461bcd60e51b815260206004820181905260248201526000805160206136c3833981519152604482015290519081900360640190fd5b6001600160a01b03831661275257600080fd5b60008085600981111561276157fe5b141561281d5761277460096008866131c2565b156127ed576001600160a01b03841660009081526009602052604081205561279d6007856132ac565b6127ed57600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600860205260409020805460ff81161560ff199091168117909155612f4e565b600185600981111561282b57fe5b14156128e75761283e600c600b866131c2565b156128b7576001600160a01b0384166000908152600c6020526040812055612867600a856132ac565b6128b757600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600b60205260409020805460ff81161560ff199091168117909155612f4e565b60028560098111156128f557fe5b14156129b15761290860056004866131c2565b15612981576001600160a01b0384166000908152600560205260408120556129316003856132ac565b61298157600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600460205260409020805460ff81161560ff199091168117909155612f4e565b60038560098111156129bf57fe5b1415612ab8576129d260166015866131c2565b15612a8857601480546001810182557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319166001600160a01b038716908117909155600090815260166020526040812055612a3890856132ac565b612a8857601480546001810182556000919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601560205260409020805460ff81161560ff199091168117909155612f4e565b6004856009811115612ac657fe5b1415612bbf57612ad960126011866131c2565b15612b8f57601080546001810182557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b038716908117909155600090815260126020526040812055612b3f90856132ac565b612b8f57601080546001810182556000919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601160205260409020805460ff81161560ff199091168117909155612f4e565b6005856009811115612bcd57fe5b1415612cab57612be0600f600e866131c2565b15612c59576001600160a01b0384166000908152600f6020526040812055612c09600d856132ac565b612c5957600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b038381166000908152600e60209081526040808320805460ff81161560ff199091168117909155601390925290912080546001600160a01b03191692851692909217909155612f4e565b6006856009811115612cb957fe5b1415612d7557612ccc60196018866131c2565b15612d45576001600160a01b038416600090815260196020526040812055612cf56017856132ac565b612d4557601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601860205260409020805460ff81161560ff199091168117909155612f4e565b6007856009811115612d8357fe5b1415612e3f57612d96601c601b866131c2565b15612e0f576001600160a01b0384166000908152601c6020526040812055612dbf601a856132ac565b612e0f57601a80546001810182556000919091527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601b60205260409020805460ff81161560ff199091168117909155612f4e565b6008856009811115612e4d57fe5b1415612f0857612e606020601f866131c2565b15612ed8576001600160a01b0384166000908152602080526040812055612e88601e856132ac565b612ed857601e80546001810182556000919091527f50bb669a95c7b50b7e8a6f09454034b2b14cf2b85c730dca9a539ca82cb6e3500180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601f60205260409020805460ff81161560ff199091168117909155612f4e565b6009856009811115612f1657fe5b1415612f4457506000602255602180546001600160a01b0319166001600160a01b0385161790556001612f4e565b6000915050612fa5565b846009811115612f5a57fe5b604080516001600160a01b0387168152831515602082015281517f0dcacb7e392f3d6a216ed2660e3dcfd40b7793d33591db2ba185a6b8e44fc477929181900390910190a260019150505b9392505050565b60245481565b600d8181548110610c9e57600080fd5b60126020526000908152604090205481565b6000612fa583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506132fc565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613068908490613393565b505050565b600082820183811015612fa5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826130d6575060006114d9565b828202828482816130e357fe5b0414612fa55760405162461bcd60e51b81526004018080602001828103825260218152602001806136a26021913960400191505060405180910390fd5b6000612fa583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613444565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526131bc908590613393565b50505050565b6001600160a01b03811660009081526020839052604081205460ff166132a2576001600160a01b038216600090815260208590526040902054613239576040805162461bcd60e51b815260206004820152600a6024820152694d75737420717565756560b01b604482015290519081900360640190fd5b6001600160a01b03821660009081526020859052604090205443101561329a576040805162461bcd60e51b8152602060048201526011602482015270145d595d59481b9bdd08195e1c1a5c9959607a1b604482015290519081900360640190fd5b506001612fa5565b5060009392505050565b6000805b83548110156132a257826001600160a01b03168482815481106132cf57fe5b6000918252602090912001546001600160a01b031614156132f45760019150506114d9565b6001016132b0565b6000818484111561338b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613350578181015183820152602001613338565b50505050905090810190601f16801561337d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60606133e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166134a99092919063ffffffff16565b8051909150156130685780806020019051602081101561340757600080fd5b50516130685760405162461bcd60e51b815260040180806020018281038252602a815260200180613703602a913960400191505060405180910390fd5b600081836134935760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613350578181015183820152602001613338565b50600083858161349f57fe5b0495945050505050565b60606134b884846000856134c0565b949350505050565b60606134cb8561362d565b61351c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061355b5780518252601f19909201916020918201910161353c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146135bd576040519150601f19603f3d011682016040523d82523d6000602084013e6135c2565b606091505b509150915081156135d65791506134b89050565b8051156135e65780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315613350578181015183820152602001613338565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c546f6b656e20666c6f6f722076616c75652063616e206f6e6c7920626520736574206f6e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657293bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d665361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220138383546aae90fd6ee919ba3a41d500524c5144e52d8564f795ce5324cc7ea564736f6c63430007050033

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

000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d500000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd4600000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5200000000000000000000000000000000000000000000000000000000002625a00000000000000000000000000000000000000000000000000000000001dcd650000000000000000000000000000000000000000000000000000000000ee6b2800000000000000000000000000000000000000000000000000000000000000ce5

-----Decoded View---------------
Arg [0] : _BTRFLY (address): 0xC0d4Ceb216B3BA9C3701B291766fDCbA977ceC3A
Arg [1] : _OHM (address): 0x64aa3364F17a4D01c6f1751Fd97C2BD3D7e7f1D5
Arg [2] : _sOHM (address): 0x04906695D6D12CF5459975d7C3C03356E4Ccd460
Arg [3] : _CVX (address): 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B
Arg [4] : _CRV (address): 0xD533a949740bb3306d119CC777fa900bA034cd52
Arg [5] : _OHMFloor (uint256): 2500000
Arg [6] : _CVXFloor (uint256): 31250000
Arg [7] : _CRVFloor (uint256): 250000000
Arg [8] : _newBlocksNeededForQueue (uint256): 3301

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000c0d4ceb216b3ba9c3701b291766fdcba977cec3a
Arg [1] : 00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5
Arg [2] : 00000000000000000000000004906695d6d12cf5459975d7c3c03356e4ccd460
Arg [3] : 0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b
Arg [4] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [5] : 00000000000000000000000000000000000000000000000000000000002625a0
Arg [6] : 0000000000000000000000000000000000000000000000000000000001dcd650
Arg [7] : 000000000000000000000000000000000000000000000000000000000ee6b280
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000ce5


Deployed Bytecode Sourcemap

6755:21220:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13409:587;;;;;;;;;;;;;;;;-1:-1:-1;13409:587:0;;;;;;-1:-1:-1;;;;;13409:587:0;;:::i;:::-;;9456:32;;;;;;;;;;;;;;;;-1:-1:-1;9456:32:0;;:::i;:::-;;;;-1:-1:-1;;;;;9456:32:0;;;;;;;;;;;;;;4143:159;;;:::i;10168:47::-;;;;;;;;;;;;;;;;-1:-1:-1;10168:47:0;-1:-1:-1;;;;;10168:47:0;;:::i;:::-;;;;;;;;;;;;;;;;16471:626;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16471:626:0;;;;;;;;:::i;17633:149::-;;;:::i;8478:52::-;;;;;;;;;;;;;;;;-1:-1:-1;8478:52:0;-1:-1:-1;;;;;8478:52:0;;:::i;:::-;;;;;;;;;;;;;;;;;;14141:865;;;;;;;;;;;;;;;;-1:-1:-1;14141:865:0;;;;;;-1:-1:-1;;;;;14141:865:0;;:::i;9357:51::-;;;;;;;;;;;;;;;;-1:-1:-1;9357:51:0;-1:-1:-1;;;;;9357:51:0;;:::i;18755:551::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18755:551:0;;;;;;;;:::i;7935:31::-;;;:::i;15938:388::-;;;;;;;;;;;;;;;;-1:-1:-1;15938:388:0;;:::i;8290:50::-;;;;;;;;;;;;;;;;-1:-1:-1;8290:50:0;-1:-1:-1;;;;;8290:50:0;;:::i;17935:654::-;;;:::i;8631:32::-;;;;;;;;;;;;;;;;-1:-1:-1;8631:32:0;;:::i;12825:430::-;;;;;;;;;;;;;;;;-1:-1:-1;12825:430:0;;;;;;-1:-1:-1;;;;;12825:430:0;;:::i;4310:261::-;;;;;;;;;;;;;;;;-1:-1:-1;4310:261:0;-1:-1:-1;;;;;4310:261:0;;:::i;3916:90::-;;;:::i;10318:49::-;;;;;;;;;;;;;;;;-1:-1:-1;10318:49:0;-1:-1:-1;;;;;10318:49:0;;:::i;4583:221::-;;;:::i;11604:118::-;;;:::i;8147:48::-;;;;;;;;;;;;;;;;-1:-1:-1;8147:48:0;-1:-1:-1;;;;;8147:48:0;;:::i;17178:346::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17178:346:0;;;;;;;;:::i;8381:34::-;;;;;;;;;;;;;;;;-1:-1:-1;8381:34:0;;:::i;9700:::-;;;;;;;;;;;;;;;;-1:-1:-1;9700:34:0;;:::i;8202:51::-;;;;;;;;;;;;;;;;-1:-1:-1;8202:51:0;-1:-1:-1;;;;;8202:51:0;;:::i;19708:111::-;;;;;;;;;;;;;;;;-1:-1:-1;19708:111:0;-1:-1:-1;;;;;19708:111:0;;:::i;9950:24::-;;;;;;;;;;;;;;;;-1:-1:-1;9950:24:0;;:::i;8726:50::-;;;;;;;;;;;;;;;;-1:-1:-1;8726:50:0;-1:-1:-1;;;;;8726:50:0;;:::i;9009:53::-;;;;;;;;;;;;;;;;-1:-1:-1;9009:53:0;-1:-1:-1;;;;;9009:53:0;;:::i;9101:36::-;;;;;;;;;;;;;;;;-1:-1:-1;9101:36:0;;:::i;10567:25::-;;;:::i;8537:55::-;;;;;;;;;;;;;;;;-1:-1:-1;8537:55:0;-1:-1:-1;;;;;8537:55:0;;:::i;10465:22::-;;;:::i;9200:54::-;;;;;;;;;;;;;;;;-1:-1:-1;9200:54:0;-1:-1:-1;;;;;9200:54:0;;:::i;8952:50::-;;;;;;;;;;;;;;;;-1:-1:-1;8952:50:0;-1:-1:-1;;;;;8952:50:0;;:::i;9856:55::-;;;;;;;;;;;;;;;;-1:-1:-1;9856:55:0;-1:-1:-1;;;;;9856:55:0;;:::i;9608:53::-;;;;;;;;;;;;;;;;-1:-1:-1;9608:53:0;-1:-1:-1;;;;;9608:53:0;;:::i;10224:31::-;;;;;;;;;;;;;;;;-1:-1:-1;10224:31:0;;:::i;11936:881::-;;;;;;;;;;;;;;;;-1:-1:-1;11936:881:0;;;-1:-1:-1;;;;;11936:881:0;;;;;;;;;;:::i;8783:53::-;;;;;;;;;;;;;;;;-1:-1:-1;8783:53:0;-1:-1:-1;;;;;8783:53:0;;:::i;10494:24::-;;;:::i;19440:260::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19440:260:0;;;;;;;;:::i;10086:45::-;;;;;;;;;;;;;;;;-1:-1:-1;10086:45:0;-1:-1:-1;;;;;10086:45:0;;:::i;8072:30::-;;;;;;;;;;;;;;;;-1:-1:-1;8072:30:0;;:::i;7973:32::-;;;:::i;15173:631::-;;;;;;;;;;;;;;;;-1:-1:-1;15173:631:0;;;;;;-1:-1:-1;;;;;15173:631:0;;:::i;9797:52::-;;;;;;;;;;;;;;;;-1:-1:-1;9797:52:0;-1:-1:-1;;;;;9797:52:0;;:::i;19997:1791::-;;;;;;;;;;;;;;;;-1:-1:-1;19997:1791:0;;;;;;;;-1:-1:-1;;;;;19997:1791:0;;:::i;9551:50::-;;;;;;;;;;;;;;;;-1:-1:-1;9551:50:0;-1:-1:-1;;;;;9551:50:0;;:::i;8018:45::-;;;:::i;10037:42::-;;;;;;;;;;;;;;;;-1:-1:-1;10037:42:0;-1:-1:-1;;;;;10037:42:0;;:::i;10374:52::-;;;;;;;;;;;;;;;;-1:-1:-1;10374:52:0;-1:-1:-1;;;;;10374:52:0;;:::i;21998:4842::-;;;;;;;;;;;;;;;;-1:-1:-1;21998:4842:0;;;;;-1:-1:-1;;;;;21998:4842:0;;;;;;;;;;;;:::i;10632:21::-;;;:::i;8875:32::-;;;;;;;;;;;;;;;;-1:-1:-1;8875:32:0;;:::i;9261:57::-;;;;;;;;;;;;;;;;-1:-1:-1;9261:57:0;-1:-1:-1;;;;;9261:57:0;;:::i;13409:587::-;-1:-1:-1;;;;;13488:24:0;;;;;;:14;:24;;;;;;;;13479:51;;;;;-1:-1:-1;;;13479:51:0;;;;;;;;;;;;-1:-1:-1;;;13479:51:0;;;;;;;;;;;;;;;13613:10;13595:30;;;;:16;:30;;;;;;;;:38;;:30;:38;13586:65;;;;;-1:-1:-1;;;13586:65:0;;;;;;;;;;;;-1:-1:-1;;;13586:65:0;;;;;;;;;;;;;;;13664:10;13677:26;13686:6;13694:7;13677;:26::i;:::-;13664:39;;13728:6;-1:-1:-1;;;;;13714:31:0;;13747:10;13759:5;13714:52;;;;;;;;;;;;;-1:-1:-1;;;;;13714:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13795:13:0;;:26;;-1:-1:-1;13795:13:0;-1:-1:-1;13814:5:0;13795:17;:26::i;:::-;13779:13;:42;;;13837:32;;-1:-1:-1;;;;;;;;;;;13837:32:0;;;;13882:52;-1:-1:-1;;;;;13882:29:0;;13913:10;13925:7;13882:29;:52::i;:::-;13952:36;;;;;;;;;;;;;;-1:-1:-1;;;;;13952:36:0;;;;;;;;;;;13409:587;;;:::o;9456:32::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9456:32:0;;-1:-1:-1;9456:32:0;:::o;4143:159::-;4057:6;;-1:-1:-1;;;;;4057:6:0;4067:10;4057:20;4048:67;;;;;-1:-1:-1;;;4048:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4048:67:0;;;;;;;;;;;;;;;4260:1:::1;4244:6:::0;;4227:37:::1;::::0;-1:-1:-1;;;;;4244:6:0;;::::1;::::0;4227:37:::1;::::0;4260:1;;4227:37:::1;4292:1;4275:19:::0;;-1:-1:-1;;;;;;4275:19:0::1;::::0;;4143:159::o;10168:47::-;;;;;;;;;;;;;:::o;16471:626::-;-1:-1:-1;;;;;16543:26:0;;;;;;:16;:26;;;;;;;;16539:209;;;16616:10;16596:32;;;;:18;:32;;;;;;;;16587:59;;;;;-1:-1:-1;;;16587:59:0;;;;;;;;;;;;-1:-1:-1;;;16587:59:0;;;;;;;;;;;;;;;16539:209;;;16706:10;16688:30;;;;:16;:30;;;;;;;;16679:57;;;;;-1:-1:-1;;;16679:57:0;;;;;;;;;;;;-1:-1:-1;;;16679:57:0;;;;;;;;;;;;;;;16760:10;16773:24;16781:6;16789:7;16773;:24::i;:::-;16760:37;;16826:16;:14;:16::i;:::-;16817:5;:25;;16808:61;;;;;-1:-1:-1;;;16808:61:0;;;;;;;;;;;;-1:-1:-1;;;16808:61:0;;;;;;;;;;;;;;;16898:13;;:26;;16917:5;16898:17;:26::i;:::-;16882:13;:42;;;16940:32;;-1:-1:-1;;;;;;;;;;;16940:32:0;;;;16985:52;-1:-1:-1;;;;;16985:29:0;;17016:10;17028:7;16985:29;:52::i;:::-;17055:34;;;;;;;;-1:-1:-1;;;;;17055:34:0;;;;;;;;;;;;;16471:626;;;:::o;17633:149::-;17681:4;17706:68;17725:47;17761:9;;17733:6;-1:-1:-1;;;;;17725:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17725:30:0;;:34;:47::i;:::-;17706:13;;;:17;:68::i;:::-;17699:75;;17633:149;:::o;8478:52::-;;;;;;;;;;;;;;;:::o;14141:865::-;14231:10;14221:22;;;;:8;:22;;;;;;;;14212:49;;;;;-1:-1:-1;;;14212:49:0;;;;;;;;;;;;-1:-1:-1;;;14212:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14281:24:0;;;;;;:14;:24;;;;;;;;14272:51;;;;;-1:-1:-1;;;14272:51:0;;;;;;;;;;;;-1:-1:-1;;;14272:51:0;;;;;;;;;;;;;;;14336:10;14349:26;14358:6;14366:7;14349;:26::i;:::-;14415:7;;14407:41;;;-1:-1:-1;;;14407:41:0;;14436:10;14407:41;;;;;;14336:39;;-1:-1:-1;14388:16:0;;-1:-1:-1;;;;;14415:7:0;;;;14407:27;;:41;;;;;;;;;;;;;;;14415:7;14407:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14407:41:0;14552:10;14499:18;14537:27;;;:13;14407:41;14537:27;;;;;14407:41;;-1:-1:-1;14499:18:0;14520:46;;14407:41;;14520:15;:46::i;:::-;14499:67;;14595:13;14586:5;:22;;14577:55;;;;;-1:-1:-1;;;14577:55:0;;;;;;;;;;;;-1:-1:-1;;;14577:55:0;;;;;;;;;;;;;;;14690:10;14675:27;;;;:13;:27;;;;;;:40;;14708:5;14675:31;:40::i;:::-;14660:10;14645:27;;;;:13;:27;;;;;:70;14738:9;;:22;;14753:5;14738:13;:22::i;:::-;14726:9;:34;14789:13;;:26;;14808:5;14789:17;:26::i;:::-;14773:13;:42;;;14831:32;;-1:-1:-1;;;;;;;;;;;14831:32:0;;;;14876:48;;;-1:-1:-1;;;14876:48:0;;14903:10;14876:48;;;;;;;;;;;;-1:-1:-1;;;;;14876:25:0;;;;;:48;;;;;;;;;;;;;;-1:-1:-1;14876:25:0;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14950:48:0;;;;;;14876;14950;;;;;;;-1:-1:-1;;;;;14950:48:0;;;14962:10;;14950:48;;;;;;;;;;;14141:865;;;;;:::o;9357:51::-;;;;;;;;;;;;-1:-1:-1;;;;;9357:51:0;;:::o;18755:551::-;-1:-1:-1;;;;;18856:24:0;;18826:11;18856:24;;;:14;:24;;;;;;;;18851:448;;;19007:132;19114:16;:24;19131:6;-1:-1:-1;;;;;19114:24:0;-1:-1:-1;;;;;19114:24:0;;;;;;;;;;;;;19007:102;19101:7;19007:89;19075:6;-1:-1:-1;;;;;19067:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19067:27:0;19026;;;-1:-1:-1;;;19026:27:0;;;;19061:33;;;;:2;:33;;19007:48;;-1:-1:-1;;;;;19034:6:0;19026:25;;;;:27;;;;;19067;;19026;;;;;;;;:25;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19026:27:0;19007:7;;19020:33;;:2;:33;19007:11;:48::i;:::-;:52;;:89::i;:::-;:93;;:102::i;:132::-;18998:141;;18851:448;;;-1:-1:-1;;;;;19162:26:0;;;;;;:16;:26;;;;;;;;19157:142;;;-1:-1:-1;;;;;19232:24:0;;;;;;;:14;:24;;;;;;;;;;19215:72;;-1:-1:-1;;;19215:72:0;;;;;;;;;;;;;;;;;19232:24;;;;;19215:53;;:72;;;;;;;;;;;19232:24;19215:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19215:72:0;;-1:-1:-1;19157:142:0;18755:551;;;;:::o;7935:31::-;;;:::o;15938:388::-;16022:10;16012:22;;;;:8;:22;;;;;;;;16003:49;;;;;-1:-1:-1;;;16003:49:0;;;;;;;;;;;;-1:-1:-1;;;16003:49:0;;;;;;;;;;;;;;;16065:54;;;-1:-1:-1;;;16065:54:0;;16098:10;16065:54;;;;;;;;;;;;-1:-1:-1;;;;;16079:6:0;16065:31;;;;:54;;;;;-1:-1:-1;;16065:54:0;;;;;;;-1:-1:-1;16065:31:0;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16177:10:0;16162:27;;;;:13;:27;;;;;;:42;;-1:-1:-1;16162:27:0;-1:-1:-1;16195:7:0;16162:31;:42::i;:::-;16147:10;16132:27;;;;:13;:27;;;;;:72;16227:9;;:24;;16242:7;16227:13;:24::i;:::-;16215:9;:36;16269:49;;;;;;;;;;;;;;-1:-1:-1;;;;;16292:6:0;16269:49;;16280:10;;16269:49;;;;;;;;;;;15938:388;:::o;8290:50::-;;;;;;;;;;;;;:::o;17935:654::-;17980:13;;18004:221;18025:13;:20;18021:24;;18004:221;;;18079:134;18112:86;18121:13;18136:1;18121:18;;;;;;;;;;;;;;;;;;18149:13;:18;;-1:-1:-1;;;;;18121:18:0;;;;18164:1;;18149:18;;;;;;;;;;;;;;;;;18141:55;;;-1:-1:-1;;;18141:55:0;;18189:4;18141:55;;;;;;-1:-1:-1;;;;;18149:18:0;;;;18141:38;;:55;;;;;;;;;;18149:18;18141:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18141:55:0;18112:7;:86::i;:::-;18079:8;;:12;:134::i;:::-;18068:145;-1:-1:-1;18047:3:0;;18004:221;;;;18240:6;18235:226;18256:15;:22;18252:26;;18235:226;;;18312:137;18344:90;18353:15;18370:1;18353:20;;;;;;;;;;;;;;;;;;18383:15;:20;;-1:-1:-1;;;;;18353:20:0;;;;18400:1;;18383:20;;;;;18312:137;18301:148;-1:-1:-1;18280:3:0;;18235:226;;;-1:-1:-1;18471:13:0;:24;;;18511:27;;18487:8;;-1:-1:-1;;;;;;;;;;;18511:27:0;;;;18554;;18571:8;;18554:27;;;;;17935:654;:::o;8631:32::-;;;;;;;;;;;;12825:430;-1:-1:-1;;;;;12897:24:0;;;;;;:14;:24;;;;;;;;;:54;;-1:-1:-1;;;;;;12925:26:0;;;;;;:16;:26;;;;;;;;12897:54;12888:81;;;;;-1:-1:-1;;;12888:81:0;;;;;;;;;;;;-1:-1:-1;;;12888:81:0;;;;;;;;;;;;;;;12980:71;-1:-1:-1;;;;;12980:33:0;;13015:10;13035:4;13042:7;12980:33;:71::i;:::-;13062:10;13075:24;13083:6;13091:7;13075;:24::i;:::-;13126:13;;13062:37;;-1:-1:-1;13126:26:0;;13062:37;13126:17;:26::i;:::-;13110:13;:42;;;13168:32;;-1:-1:-1;;;;;;;;;;;13168:32:0;;;;13216:31;;;;;;13236:10;13216:31;;;;;;-1:-1:-1;;;;;13216:31:0;;;;;;;;;;;12825:430;;;:::o;4310:261::-;4057:6;;-1:-1:-1;;;;;4057:6:0;4067:10;4057:20;4048:67;;;;;-1:-1:-1;;;4048:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4048:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;4413:23:0;::::1;4404:75;;;;-1:-1:-1::0;;;4404:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4512:6;::::0;;4495:36:::1;::::0;-1:-1:-1;;;;;4495:36:0;;::::1;::::0;4512:6;::::1;::::0;4495:36:::1;::::0;::::1;4542:9;:21:::0;;-1:-1:-1;;;;;;4542:21:0::1;-1:-1:-1::0;;;;;4542:21:0;;;::::1;::::0;;;::::1;::::0;;4310:261::o;3916:90::-;3965:7;3992:6;-1:-1:-1;;;;;3992:6:0;3916:90;:::o;10318:49::-;;;;;;;;;;;;;;;:::o;4583:221::-;4667:9;;-1:-1:-1;;;;;4667:9:0;4653:10;:23;4644:71;;;;-1:-1:-1;;;4644:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4756:9;;;4748:6;;4731:36;;-1:-1:-1;;;;;4756:9:0;;;;4748:6;;;;4731:36;;;4787:9;;;4778:18;;-1:-1:-1;;;;;;4778:18:0;-1:-1:-1;;;;;4787:9:0;;;4778:18;;;;;;4583:221::o;11604:118::-;4057:6;;-1:-1:-1;;;;;4057:6:0;4067:10;4057:20;4048:67;;;;;-1:-1:-1;;;4048:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4048:67:0;;;;;;;;;;;;;;;11691:23:::1;11668:20;:46:::0;11604:118::o;8147:48::-;;;;;;;;;;;;;;;:::o;17178:346::-;17281:10;17264:29;;;;:15;:29;;;;;;;;17255:56;;;;;-1:-1:-1;;;17255:56:0;;;;;;;;;;;;-1:-1:-1;;;17255:56:0;;;;;;;;;;;;;;;17342:16;:14;:16::i;:::-;17331:7;:27;;17322:63;;;;;-1:-1:-1;;;17322:63:0;;;;;;;;;;;;-1:-1:-1;;;17322:63:0;;;;;;;;;;;;;;;17414:6;-1:-1:-1;;;;;17398:29:0;;17429:10;17441:7;17398:52;;;;;;;;;;;;;-1:-1:-1;;;;;17398:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17468:48:0;;;;;;;;-1:-1:-1;;;;;17468:48:0;;;-1:-1:-1;17483:10:0;;-1:-1:-1;17468:48:0;;;;;;;;;17178:346;;:::o;8381:34::-;;;;;;;;;;;;9700;;;;;;;;;;;;8202:51;;;;;;;;;;;;;:::o;19708:111::-;-1:-1:-1;;;;;19787:24:0;19764:4;19787:24;;;:16;:24;;;;;;;19708:111::o;9950:24::-;;;;;;;;;;;;8726:50;;;;;;;;;;;;;;;:::o;9009:53::-;;;;;;;;;;;;;:::o;9101:36::-;;;;;;;;;;;;10567:25;;;;:::o;8537:55::-;;;;;;;;;;;;;:::o;10465:22::-;;;-1:-1:-1;;;;;10465:22:0;;:::o;9200:54::-;;;;;;;;;;;;;;;:::o;8952:50::-;;;;;;;;;;;;;;;:::o;9856:55::-;;;;;;;;;;;;;:::o;9608:53::-;;;;;;;;;;;;;:::o;10224:31::-;;;;;;;;;;;;11936:881;-1:-1:-1;;;;;12051:24:0;;12018:10;12051:24;;;:14;:24;;;;;;;;;:54;;-1:-1:-1;;;;;;12079:26:0;;;;;;:16;:26;;;;;;;;12051:54;12042:81;;;;;-1:-1:-1;;;12042:81:0;;;;;;;;;;;;-1:-1:-1;;;12042:81:0;;;;;;;;;;;;;;;12134:71;-1:-1:-1;;;;;12134:33:0;;12169:10;12189:4;12196:7;12134:33;:71::i;:::-;-1:-1:-1;;;;;12223:24:0;;;;;;:14;:24;;;;;;;;12218:212;;;12294:10;12274:32;;;;:18;:32;;;;;;;;12265:59;;;;;-1:-1:-1;;;12265:59:0;;;;;;;;;;;;-1:-1:-1;;;12265:59:0;;;;;;;;;;;;;;;12218:212;;;12388:10;12366:34;;;;:20;:34;;;;;;;;12357:61;;;;;-1:-1:-1;;;12357:61:0;;;;;;;;;;;;-1:-1:-1;;;12357:61:0;;;;;;;;;;;;;;;12442:10;12455:24;12463:6;12471:7;12455;:24::i;:::-;12442:37;-1:-1:-1;12574:20:0;12442:37;12585:7;12574:9;:20::i;:::-;12566:28;;12621:6;-1:-1:-1;;;;;12605:29:0;;12636:10;12648:5;12605:50;;;;;;;;;;;;;-1:-1:-1;;;;;12605:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12684:13:0;;:26;;-1:-1:-1;12684:13:0;-1:-1:-1;12703:5:0;12684:17;:26::i;:::-;12668:13;:42;;;12726:32;;-1:-1:-1;;;;;;;;;;;12726:32:0;;;;12776:33;;;;;;;;;;;;;;-1:-1:-1;;;;;12776:33:0;;;;;;;;;;;11936:881;;;;;;:::o;8783:53::-;;;;;;;;;;;;;:::o;10494:24::-;;;;:::o;19440:260::-;4057:6;;-1:-1:-1;;;;;4057:6:0;4067:10;4057:20;4048:67;;;;;-1:-1:-1;;;4048:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4048:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19531:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;;:29;19523:80:::1;;;;-1:-1:-1::0;;;19523:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;19614:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;;;;;:33;;;19663:29;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;19440:260:::0;;:::o;10086:45::-;;;;;;;;;;;;;:::o;8072:30::-;;;;;;;;;;;;7973:32;;;;:::o;15173:631::-;15274:10;15264:22;;;;:8;:22;;;;;;;;15255:49;;;;;-1:-1:-1;;;15255:49:0;;;;;;;;;;;;-1:-1:-1;;;15255:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15324:24:0;;;;;;:14;:24;;;;;;;;15315:51;;;;;-1:-1:-1;;;15315:51:0;;;;;;;;;;;;-1:-1:-1;;;15315:51:0;;;;;;;;;;;;;;;15379:71;-1:-1:-1;;;;;15379:33:0;;15414:10;15434:4;15441:7;15379:33;:71::i;:::-;15463:10;15476:26;15485:6;15493:7;15476;:26::i;:::-;15558:10;15543:27;;;;:13;:27;;;;;;15463:39;;-1:-1:-1;15543:40:0;;15463:39;15543:31;:40::i;:::-;15528:10;15513:27;;;;:13;:27;;;;;:70;15606:9;;:22;;15621:5;15606:13;:22::i;:::-;15594:9;:34;15657:13;;:26;;15676:5;15657:17;:26::i;:::-;15641:13;:42;;;15699:32;;-1:-1:-1;;;;;;;;;;;15699:32:0;;;;15749:47;;;;;;;;;;;;;;-1:-1:-1;;;;;15749:47:0;;;15760:10;;15749:47;;;;;;;;;;;15173:631;;;:::o;9797:52::-;;;;;;;;;;;;;;;:::o;19997:1791::-;20085:4;4057:6;;-1:-1:-1;;;;;4057:6:0;4067:10;4057:20;4048:67;;;;;-1:-1:-1;;;4048:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4048:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20112:22:0;::::1;20103:33;;;::::0;::::1;;20165:25;20152:9;:38;;;;;;;;;20147:1558;;;20267:20;::::0;20249:40:::1;::::0;:12:::1;::::0;:16:::1;:40::i;:::-;-1:-1:-1::0;;;;;20213:33:0;::::1;;::::0;;;:21:::1;:33;::::0;;;;:76;20147:1558:::1;;;20325:23;20312:9;:36;;;;;;;;;20307:1398;;;20423:20;::::0;20405:40:::1;::::0;:12:::1;::::0;:16:::1;:40::i;:::-;-1:-1:-1::0;;;;;20371:31:0;::::1;;::::0;;;:19:::1;:31;::::0;;;;:74;20307:1398:::1;;;20481:21;20468:9;:34;;;;;;;;;20463:1242;;;20575:20;::::0;20557:40:::1;::::0;:12:::1;::::0;:16:::1;:40::i;:::-;-1:-1:-1::0;;;;;20525:29:0;::::1;;::::0;;;:17:::1;:29;::::0;;;;:72;20463:1242:::1;;;20633:23;20620:9;:36;;;;;;;;;20615:1090;;;20713:49;20731:29;20757:1;20731:20:::0;::::1;:24;;:29;;;;:::i;:::-;20713:12;::::0;:16:::1;:49::i;:::-;-1:-1:-1::0;;;;;20679:31:0;::::1;;::::0;;;:19:::1;:31;::::0;;;;:83;20615:1090:::1;;;20798:27;20785:9;:40;;;;;;;;;20780:925;;;20904:20;::::0;20886:40:::1;::::0;:12:::1;::::0;:16:::1;:40::i;:::-;-1:-1:-1::0;;;;;20848:35:0;::::1;;::::0;;;:23:::1;:35;::::0;;;;:78;20780:925:::1;;;20962:23;20949:9;:36;;;;;;;;;20944:761;;;21060:20;::::0;21042:40:::1;::::0;:12:::1;::::0;:16:::1;:40::i;:::-;-1:-1:-1::0;;;;;21008:31:0;::::1;;::::0;;;:19:::1;:31;::::0;;;;:74;20944:761:::1;;;21118:25;21105:9;:38;;;;;;;;;21100:605;;;21202:49;21220:29;21246:1;21220:20:::0;::::1;:24;;:29;;;;:::i;21202:49::-;-1:-1:-1::0;;;;;21166:33:0;::::1;;::::0;;;:21:::1;:33;::::0;;;;:85;21100:605:::1;;;21287:15;21274:9;:28;;;;;;;;;21269:436;;;21369:20;::::0;21351:40:::1;::::0;:12:::1;::::0;:16:::1;:40::i;:::-;-1:-1:-1::0;;;;;21325:23:0;::::1;;::::0;;;:11:::1;:23;::::0;;;;:66;21269:436:::1;;;21427:22;21414:9;:35;;;;;;;;;21409:296;;;21523:20;::::0;21505:40:::1;::::0;:12:::1;::::0;:16:::1;:40::i;:::-;-1:-1:-1::0;;;;;21472:30:0;::::1;;::::0;;;:18:::1;:30:::0;;;;;:73;21409:296:::1;;;21581:16;21568:9;:29;;;;;;;;;21563:142;;;21653:20;::::0;21635:40:::1;::::0;:12:::1;::::0;:16:::1;:40::i;:::-;21620:12;:55:::0;21563:142:::1;;;-1:-1:-1::0;21700:5:0::1;21693:12;;21563:142;21737:9;21723:35;;;;;;;;;::::0;;-1:-1:-1;;;;;21723:35:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;21776:4:0::1;19997:1791:::0;;;;:::o;9551:50::-;;;;;;;;;;;;;;;:::o;8018:45::-;;;:::o;10037:42::-;;;;;;;;;;;;;;;:::o;10374:52::-;;;;;;;;;;;;;:::o;21998:4842::-;22108:4;4057:6;;-1:-1:-1;;;;;4057:6:0;4067:10;4057:20;4048:67;;;;;-1:-1:-1;;;4048:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;4048:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22135:22:0;::::1;22126:33;;;::::0;::::1;;22170:11;::::0;22197:9:::1;:38;;;;;;;;;22192:4554;;;22263:67;22277:21;22300:18;22320:8;22263:12;:67::i;:::-;22258:293;;;-1:-1:-1::0;;;;;22352:33:0;::::1;22388:1;22352:33:::0;;;:21:::1;:33;::::0;;;;:37;22413:43:::1;22427:17;22375:8:::0;22413:12:::1;:43::i;:::-;22408:128;;22482:17;:34:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;22482:34:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;22482:34:0::1;-1:-1:-1::0;;;;;22482:34:0;::::1;;::::0;;22408:128:::1;-1:-1:-1::0;;;;;;22575:30:0;::::1;;::::0;;;:18:::1;:30;::::0;;;;;;::::1;::::0;::::1;22574:31;-1:-1:-1::0;;22620:39:0;;::::1;::::0;::::1;::::0;;;22192:4554:::1;;;22709:23;22696:9;:36;;;;;;;;;22691:4055;;;22760:63;22774:19;22795:16;22813:8;22760:12;:63::i;:::-;22755:283;;;-1:-1:-1::0;;;;;22845:31:0;::::1;22879:1;22845:31:::0;;;:19:::1;:31;::::0;;;;:35;22904:41:::1;22918:15;22866:8:::0;22904:12:::1;:41::i;:::-;22899:124;;22971:15;:32:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;22971:32:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;22971:32:0::1;-1:-1:-1::0;;;;;22971:32:0;::::1;;::::0;;22899:124:::1;-1:-1:-1::0;;;;;;23062:28:0;::::1;;::::0;;;:16:::1;:28;::::0;;;;;;::::1;::::0;::::1;23061:29;-1:-1:-1::0;;23105:37:0;;::::1;::::0;::::1;::::0;;;22691:4055:::1;;;23180:21;23167:9;:34;;;;;;;;;23162:3584;;;23229:59;23243:17;23262:14;23278:8;23229:12;:59::i;:::-;23224:273;;;-1:-1:-1::0;;;;;23310:29:0;::::1;23342:1;23310:29:::0;;;:17:::1;:29;::::0;;;;:33;23367:39:::1;23381:13;23329:8:::0;23367:12:::1;:39::i;:::-;23362:120;;23432:13;:30:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;23432:30:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;23432:30:0::1;-1:-1:-1::0;;;;;23432:30:0;::::1;;::::0;;23362:120:::1;-1:-1:-1::0;;;;;;23521:26:0;::::1;;::::0;;;:14:::1;:26;::::0;;;;;;::::1;::::0;::::1;23520:27;-1:-1:-1::0;;23562:35:0;;::::1;::::0;::::1;::::0;;;23162:3584:::1;;;23635:23;23622:9;:36;;;;;;;;;23617:3129;;;23686:63;23700:19;23721:16;23739:8;23686:12;:63::i;:::-;23681:334;;;23771:15;:32:::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;23771:32:0::1;-1:-1:-1::0;;;;;23771:32:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;23822:31:0;;;:19:::1;23771:32;23822:31:::0;;;;:35;23881:41:::1;::::0;23771:32;23881:12:::1;:41::i;:::-;23876:124;;23948:15;:32:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;23948:32:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;23948:32:0::1;-1:-1:-1::0;;;;;23948:32:0;::::1;;::::0;;23876:124:::1;-1:-1:-1::0;;;;;;24039:28:0;::::1;;::::0;;;:16:::1;:28;::::0;;;;;;::::1;::::0;::::1;24038:29;-1:-1:-1::0;;24082:37:0;;::::1;::::0;::::1;::::0;;;23617:3129:::1;;;24157:27;24144:9;:40;;;;;;;;;24139:2607;;;24212:71;24226:23;24251:20;24273:8;24212:12;:71::i;:::-;24207:358;;;24305:19;:36:::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;24305:36:0::1;-1:-1:-1::0;;;;;24305:36:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;24360:35:0;;;:23:::1;24305:36;24360:35:::0;;;;:39;24423:45:::1;::::0;24305:36;24423:12:::1;:45::i;:::-;24418:132;;24494:19;:36:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;24494:36:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;24494:36:0::1;-1:-1:-1::0;;;;;24494:36:0;::::1;;::::0;;24418:132:::1;-1:-1:-1::0;;;;;;24589:32:0;::::1;;::::0;;;:20:::1;:32;::::0;;;;;;::::1;::::0;::::1;24588:33;-1:-1:-1::0;;24636:41:0;;::::1;::::0;::::1;::::0;;;24139:2607:::1;;;24715:23;24702:9;:36;;;;;;;;;24697:2049;;;24766:63;24780:19;24801:16;24819:8;24766:12;:63::i;:::-;24761:283;;;-1:-1:-1::0;;;;;24851:31:0;::::1;24885:1;24851:31:::0;;;:19:::1;:31;::::0;;;;:35;24910:41:::1;24924:15;24872:8:::0;24910:12:::1;:41::i;:::-;24905:124;;24977:15;:32:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;24977:32:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;24977:32:0::1;-1:-1:-1::0;;;;;24977:32:0;::::1;;::::0;;24905:124:::1;-1:-1:-1::0;;;;;;25068:28:0;;::::1;;::::0;;;:16:::1;:28;::::0;;;;;;;;;::::1;::::0;::::1;25067:29;-1:-1:-1::0;;25111:37:0;;::::1;::::0;::::1;::::0;;;25163:14:::1;:26:::0;;;;;;:40;;-1:-1:-1;;;;;;25163:40:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;24697:2049:::1;;;25241:25;25228:9;:38;;;;;;;;;25223:1523;;;25294:67;25308:21;25331:18;25351:8;25294:12;:67::i;:::-;25289:293;;;-1:-1:-1::0;;;;;25383:33:0;::::1;25419:1;25383:33:::0;;;:21:::1;:33;::::0;;;;:37;25444:43:::1;25458:17;25406:8:::0;25444:12:::1;:43::i;:::-;25439:128;;25513:17;:34:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;25513:34:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;25513:34:0::1;-1:-1:-1::0;;;;;25513:34:0;::::1;;::::0;;25439:128:::1;-1:-1:-1::0;;;;;;25606:30:0;::::1;;::::0;;;:18:::1;:30;::::0;;;;;;::::1;::::0;::::1;25605:31;-1:-1:-1::0;;25651:39:0;;::::1;::::0;::::1;::::0;;;25223:1523:::1;;;25728:15;25715:9;:28;;;;;;;;;25710:1036;;;25771:47;25785:11;25798:8;25808;25771:12;:47::i;:::-;25766:243;;;-1:-1:-1::0;;;;;25840:23:0;::::1;25866:1;25840:23:::0;;;:11:::1;:23;::::0;;;;:27;25891:33:::1;25905:7;25853:8:::0;25891:12:::1;:33::i;:::-;25886:108;;25950:7;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;25950:24:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;25950:24:0::1;-1:-1:-1::0;;;;;25950:24:0;::::1;;::::0;;25886:108:::1;-1:-1:-1::0;;;;;;26033:20:0;::::1;;::::0;;;:8:::1;:20;::::0;;;;;;::::1;::::0;::::1;26032:21;-1:-1:-1::0;;26068:29:0;;::::1;::::0;::::1;::::0;;;25710:1036:::1;;;26135:22;26122:9;:35;;;;;;;;;26117:629;;;26185:61;26199:18;26219:15;26236:8;26185:12;:61::i;:::-;26180:278;;;-1:-1:-1::0;;;;;26268:30:0;::::1;26301:1;26268:30:::0;;;:18:::1;:30:::0;;;;;:34;26326:40:::1;26340:14;26288:8:::0;26326:12:::1;:40::i;:::-;26321:122;;26392:14;:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;26392:31:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;26392:31:0::1;-1:-1:-1::0;;;;;26392:31:0;::::1;;::::0;;26321:122:::1;-1:-1:-1::0;;;;;;26482:27:0;::::1;;::::0;;;:15:::1;:27;::::0;;;;;;::::1;::::0;::::1;26481:28;-1:-1:-1::0;;26524:36:0;;::::1;::::0;::::1;::::0;;;26117:629:::1;;;26598:16;26585:9;:29;;;;;;;;;26580:166;;;-1:-1:-1::0;26652:1:0::1;26637:12;:16:::0;26668:7:::1;:18:::0;;-1:-1:-1;;;;;;26668:18:0::1;-1:-1:-1::0;;;;;26668:18:0;::::1;;::::0;;-1:-1:-1;26580:166:0::1;;;26741:5;26734:12;;;;;26580:166;26781:9;26764:46;;;;;;;;;::::0;;-1:-1:-1;;;;;26764:46:0;::::1;::::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;26828:4;26821:11;;;4126:1;21998:4842:::0;;;;;:::o;10632:21::-;;;;:::o;8875:32::-;;;;;;;;;;;;9261:57;;;;;;;;;;;;;:::o;288:136::-;346:7;373:43;377:1;380;373:43;;;;;;;;;;;;;;;;;:3;:43::i;5561:177::-;5671:58;;;-1:-1:-1;;;;;5671:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5671:58:0;-1:-1:-1;;;5671:58:0;;;5644:86;;5664:5;;5644:19;:86::i;:::-;5561:177;;;:::o;99:181::-;157:7;189:5;;;213:6;;;;205:46;;;;;-1:-1:-1;;;205:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;632:250;690:7;714:6;710:47;;-1:-1:-1;744:1:0;737:8;;710:47;781:5;;;785:1;781;:5;:1;805:5;;;;;:10;797:56;;;;-1:-1:-1;;;797:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;890:132;948:7;975:39;979:1;982;975:39;;;;;;;;;;;;;;;;;:3;:39::i;5746:205::-;5874:68;;;-1:-1:-1;;;;;5874:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5874:68:0;-1:-1:-1;;;5874:68:0;;;5847:96;;5867:5;;5847:19;:96::i;:::-;5746:205;;;;:::o;27088:438::-;-1:-1:-1;;;;;27301:19:0;;27277:4;27301:19;;;;;;;;;;;;;27295:210;;-1:-1:-1;;;;;27347:18:0;;;;;;;;;;;;;;27338:48;;;;;-1:-1:-1;;;27338:48:0;;;;;;;;;;;;-1:-1:-1;;;27338:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27410:18:0;;;;;;;;;;;;;;27432:12;-1:-1:-1;27410:34:0;27401:66;;;;;-1:-1:-1;;;27401:66:0;;;;;;;;;;;;-1:-1:-1;;;27401:66:0;;;;;;;;;;;;;;;-1:-1:-1;27489:4:0;27482:11;;27295:210;-1:-1:-1;27513:5:0;27088:438;;;;;:::o;27695:277::-;27784:4;;27802:140;27823:12;;27819:16;;27802:140;;;27876:6;-1:-1:-1;;;;;27862:20:0;:5;27869:1;27862:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27862:10:0;:20;27858:73;;;27911:4;27904:11;;;;;27858:73;27837:3;;27802:140;;432:192;518:7;554:12;546:6;;;;538:29;;;;-1:-1:-1;;;538:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;590:5:0;;;432:192::o;5959:418::-;6040:23;6066:69;6094:4;6066:69;;;;;;;;;;;;;;;;;6074:5;-1:-1:-1;;;;;6066:27:0;;;:69;;;;;:::i;:::-;6150:17;;6040:95;;-1:-1:-1;6150:21:0;6146:224;;6292:10;6281:30;;;;;;;;;;;;;;;-1:-1:-1;6281:30:0;6273:85;;;;-1:-1:-1;;;6273:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1030:189;1116:7;1151:12;1144:5;1136:28;;;;-1:-1:-1;;;1136:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1175:9;1191:1;1187;:5;;;;;;;1030:189;-1:-1:-1;;;;;1030:189:0:o;1679:196::-;1782:12;1814:53;1837:6;1845:4;1851:1;1854:12;1814:22;:53::i;:::-;1807:60;1679:196;-1:-1:-1;;;;1679:196:0:o;1883:817::-;2013:12;2046:18;2057:6;2046:10;:18::i;:::-;2038:60;;;;;-1:-1:-1;;;2038:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2172:12;2186:23;2213:6;-1:-1:-1;;;;;2213:11:0;2233:8;2244:4;2213:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2213:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2171:78;;;;2264:7;2260:433;;;2295:10;-1:-1:-1;2288:17:0;;-1:-1:-1;2288:17:0;2260:433;2342:17;;:21;2338:344;;2510:10;2504:17;2571:15;2558:10;2554:2;2550:19;2543:44;2458:148;2646:20;;-1:-1:-1;;;2646:20:0;;;;;;;;;;;;;;;;;2653:12;;2646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1249:422;1616:20;1655:8;;;1249:422::o

Swarm Source

ipfs://138383546aae90fd6ee919ba3a41d500524c5144e52d8564f795ce5324cc7ea5

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.