Contract 0xDeb204424Fc64477ab2f097812E6D53E8eCf4b53 1

 

Contract Overview

Balance:
0 FTM

FTM Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x741ad9e2cbbbc2e8667925c70cb8ef7cd7c5f022911dc8526943f2f639ee5fb1Withdraw All630827242023-05-25 21:32:318 days 10 hrs ago0xc64ae9d55e57ed56c77f9cc62d318db39abc69d5 IN  0xdeb204424fc64477ab2f097812e6d53e8ecf4b530 FTM0.015142959
0x5402576435d789ab6593af467f1f74891118d846109197e7be746464602e2ea0Harvest630818642023-05-25 21:15:498 days 10 hrs ago0xc64ae9d55e57ed56c77f9cc62d318db39abc69d5 IN  0xdeb204424fc64477ab2f097812e6d53e8ecf4b530 FTM0.078678537
0x2075e0c41fd2af0fe7d3b33433338a1783fff7bcbc7b012a3dca524d603b3d67Deposit All630816942023-05-25 21:11:318 days 10 hrs ago0xc64ae9d55e57ed56c77f9cc62d318db39abc69d5 IN  0xdeb204424fc64477ab2f097812e6d53e8ecf4b530 FTM0.02069733
0xbbec52e676bde91e9ddf377b2f19b2cc0a17009951a70c514aa66d578285cf8eWithdraw All630806182023-05-25 20:52:248 days 11 hrs ago0xc64ae9d55e57ed56c77f9cc62d318db39abc69d5 IN  0xdeb204424fc64477ab2f097812e6d53e8ecf4b530 FTM0.02121537
0x8aec7094b21fe9ad4d453b609ef813f7763f7fffe6c497a99c804d7071ac9fe7Deposit All630796192023-05-25 20:31:438 days 11 hrs ago0xc64ae9d55e57ed56c77f9cc62d318db39abc69d5 IN  0xdeb204424fc64477ab2f097812e6d53e8ecf4b530 FTM0.027097496
0x5ee2193201eaf5121e9e262711c6db9f26b6d6d9e896c7da5787856a4f9b10cc0x61010060630795412023-05-25 20:29:568 days 11 hrs ago0xc64ae9d55e57ed56c77f9cc62d318db39abc69d5 IN  Create: XpandrUnityVault0 FTM0.334780479646
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x5ee2193201eaf5121e9e262711c6db9f26b6d6d9e896c7da5787856a4f9b10cc630795412023-05-25 20:29:568 days 11 hrs ago 0xc64ae9d55e57ed56c77f9cc62d318db39abc69d5  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XpandrUnityVault

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2023-05-25
*/

// File contracts/interfaces/AccessControl.sol

pragma solidity ^0.8.19;

/**
@notice Based on solmate's Owned.sol with added access control for an operator & error code + if instead of requires.
 */

 error NoAuth();
 error NotStrategist();

abstract contract AccessControl {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnershipTransferred(address indexed user, address indexed newOwner);
    event SetStrategist(address indexed user, address indexed newStrategist);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;
    address public strategist;

    modifier onlyOwner() virtual {
        checkOwner();
        _;
    }

    modifier onlyAdmin() virtual {
        checkAdmin();
        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor() {
        owner = msg.sender;
        strategist = msg.sender;

        emit OwnershipTransferred(address(0), owner);
        emit SetStrategist(address(0), strategist);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) external virtual onlyOwner {
        owner = newOwner;
        emit OwnershipTransferred(msg.sender, newOwner);
    }

    function setStrategist(address _newStrategist) external virtual {
        if(msg.sender != strategist){revert NotStrategist();}
        strategist = _newStrategist;
        emit SetStrategist(msg.sender, strategist);
    }

    function checkOwner() internal virtual {
        if(msg.sender != owner){revert NoAuth();}
    }


    function checkAdmin() internal virtual {
        if(msg.sender != owner || msg.sender != strategist){revert NoAuth();}
    }

}


// File contracts/interfaces/Pauser.sol

// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.19;

/**
@notice - Modified version of OZ's Pausable.sol, using uint instead of bool &error codes w/ Ifs
          instead of requires w/ strings for cheaper gas costs
 */

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */

error NotPaused();
error Paused();

abstract contract Pauser {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event WasPaused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    uint8 public _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = 0;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns 1 if the contract is paused, and 0 otherwise.
     */
    function paused() public view virtual returns (uint8) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        //require(paused() != 0, "Pausable: paused");
        if(paused() != 0){revert Paused();}
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        //require(paused() == 1, "Pausable: not paused");
        if(paused() != 1){revert NotPaused();}

    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = 1;
        emit WasPaused(msg.sender);
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = 0;
        emit Unpaused(msg.sender);
    }
}


// File contracts/interfaces/XpandrErrors.sol

pragma solidity ^0.8.19;

contract XpandrErrors {
    error ZeroAmount();
    error ZeroAddress();
    error NotVault();
    error NotEOA();
    error NotAccountOwner();
    error OverCap();
    error UnderTimeLock();
    error InvalidDelay();
    error InvalidProposal();
    error InvalidTokenOrPath();
    error UnusedFunction();
}


// File contracts/interfaces/solmate/ERC20.sol

pragma solidity ^0.8.19;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }*/

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}


// File contracts/interfaces/solmate/FixedPointMathLib.sol

pragma solidity ^0.8.19;

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant MAX_UINT256 = 2**256 - 1;

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // Divide x * y by the denominator.
            z := div(mul(x, y), denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // If x * y modulo the denominator is strictly greater than 0,
            // 1 is added to round up the division of x * y by the denominator.
            z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
        }
    }

}


// File contracts/interfaces/solmate/SafeTransferLib.sol

pragma solidity ^0.8.19;

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}


// File contracts/interfaces/solmate/ERC4626light.sol

pragma solidity ^0.8.19;



/// @notice Minimal ERC4626 tokenized Vault implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/mixins/ERC4626.sol)
abstract contract ERC4626 is ERC20 {
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint256;

    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);

    event Withdraw(
        address indexed caller,
        address indexed receiver,
        address indexed owner,
        uint256 assets,
        uint256 shares
    );

    /*//////////////////////////////////////////////////////////////
                               IMMUTABLES
    //////////////////////////////////////////////////////////////*/

    ERC20 public immutable asset;

    constructor(
        ERC20 _asset,
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol, _asset.decimals()) {
        asset = _asset;
    }

    /*//////////////////////////////////////////////////////////////
                        DEPOSIT/WITHDRAWAL LOGIC
    //////////////////////////////////////////////////////////////*/

    function deposit(uint256 assets, address receiver) public virtual returns (uint256 shares) {
        // Check for rounding error since we round down in previewDeposit.
        require((shares = convertToShares(assets)) != 0, "ZERO_SHARES");

        // Need to transfer before minting or ERC777s could reenter.
        asset.safeTransferFrom(msg.sender, address(this), assets);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);

        //afterDeposit(assets, shares);
    }

    /*
    function mint(uint256 shares, address receiver) public virtual returns (uint256 assets) {
        assets = previewMint(shares); // No need to check for rounding error, previewMint rounds up.

        // Need to transfer before minting or ERC777s could reenter.
        asset.safeTransferFrom(msg.sender, address(this), assets);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);

        afterDeposit(assets, shares);
    }
    */

    function withdraw(
        uint256 assets,
        address receiver,
        address owner
    ) public virtual returns (uint256 shares) {
        shares = convertToShares(assets); // No need to check for rounding error, previewWithdraw rounds up.

        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares;
        }

        //beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        asset.safeTransfer(receiver, assets);
    }
    /*
    function redeem(
        uint256 shares,
        address receiver,
        address owner
    ) public virtual returns (uint256 assets) {
        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares;
        }

        // Check for rounding error since we round down in previewRedeem.
        require((assets = previewRedeem(shares)) != 0, "ZERO_ASSETS");

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        asset.safeTransfer(receiver, assets);
    }
    */

    /*//////////////////////////////////////////////////////////////
                            ACCOUNTING LOGIC
    //////////////////////////////////////////////////////////////*/

    function totalAssets() public view virtual returns (uint256);

    function convertToShares(uint256 assets) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivDown(supply, totalAssets());
    }

    function convertToAssets(uint256 shares) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.
        return supply == 0 ? shares : shares.mulDivDown(totalAssets(), supply);
    }

    /*
     function previewWithdraw(uint256 assets) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.
        return supply == 0 ? assets : assets.mulDivUp(supply, totalAssets());
    }

    function previewDeposit(uint256 assets) public view virtual returns (uint256) {
        return convertToShares(assets);
    }

    function previewRedeem(uint256 shares) public view virtual returns (uint256) {
        return convertToAssets(shares);
    }

    function previewMint(uint256 shares) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.
        return supply == 0 ? shares : shares.mulDivUp(totalAssets(), supply);
    }

    //////////////////////////////////////////////////////////////
                     DEPOSIT/WITHDRAWAL LIMIT LOGIC
    //////////////////////////////////////////////////////////////

    function maxDeposit(address) public view virtual returns (uint256) {
        return type(uint256).max;
    }

    function maxMint(address) public view virtual returns (uint256) {
        return type(uint256).max;
    }

    function maxWithdraw(address owner) public view virtual returns (uint256) {
        return convertToAssets(balanceOf[owner]);
    }

    function maxRedeem(address owner) public view virtual returns (uint256) {
        return balanceOf[owner];
    }

    ///////////////////////////////////////////////////////////////
                          INTERNAL HOOKS LOGIC
    //////////////////////////////////////////////////////////////*/

    //function beforeWithdraw(uint256 assets, uint256 shares) internal virtual {}

    function afterDeposit(uint256 assets, uint256 shares) internal virtual {}
}


// File contracts/interfaces/IEqualizerPair.sol


pragma solidity ^0.8.19;

interface IEqualizerPair {
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function sample(address tokenIn, uint amountIn, uint points, uint window) external view returns (uint[] memory);
}


// File contracts/interfaces/IEqualizerRouter.sol


pragma solidity ^0.8.19;

interface IEqualizerRouter {

    // Routes
    struct Routes {
        address from;
        address to;
        bool stable;
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

     function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        Routes[] memory route,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

     function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        Routes[] calldata routes,
        address to,
        uint deadline
    ) external;

    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable);
    function getAmountsOut(uint amountIn, Routes[] memory routes) external view returns (uint[] memory amounts);

    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity);
}


// File contracts/interfaces/IEqualizerGauge.sol


pragma solidity ^0.8.19;

interface IEqualizerGauge {
    function deposit(uint256 amount) external;
    function withdraw(uint256 amount) external;
    function getReward(address user, address[] memory rewards) external;
    function earned(address token, address user) external view returns (uint256);
    function balanceOf(address user) external view returns (uint256);
}


// File contracts/XpandrUnityVault.sol

// SPDX-License-Identifier: No License (None)
// No permissions granted before Sunday, 5th May 2025, then GPL-3.0 after this date.

/**
@title  - XpandrUnityVault
@author - Nikar0
@notice - Immutable, streamlined, security & gas considerate unified Vault + Strategy contract.
          Includes: feeToken switch / 0% withdraw fee default / Vault profit in USD / Adjustable platformFee for promo events w/ max cap at default.
          Deposit & harvest buffers / Timestamp & Slippage protection

https://www.github.com/nikar0/Xpandr4626  @Nikar0_


Vault based on EIP-4626 by @joey_santoro, @transmissions11, et all.
https://eips.ethereum.org/EIPS/eip-4626

Using solmate's gas optimized libs
https://github.com/transmissions11/solmate

Special thanks to 543 from Equalizer/Guru_Network for the brainstorming & QA

@notice - AccessControl = modified solmate Owned.sol w/ added Strategist + error codes.
        - Pauser = modified OZ Pausable.sol using uint8 instead of bool + error codes.
**/

pragma solidity ^0.8.19;
contract XpandrUnityVault is ERC4626, AccessControl, Pauser {
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint;

    /*//////////////////////////////////////////////////////////////
                          VARIABLES & EVENTS
    //////////////////////////////////////////////////////////////*/

    event Harvest(address indexed harvester);
    event SetRouterOrGauge(address indexed newRouter, address indexed newGauge);
    event SetFeeToken(address indexed newFeeToken);
    event SetPaths(IEqualizerRouter.Routes[] indexed path1, IEqualizerRouter.Routes[] indexed path2);
    event Panic(address indexed caller);
    event CustomTx(address indexed from, uint indexed amount);
    event SetFeesAndRecipient(uint64 indexed withdrawFee, uint64 indexed totalFees, address indexed newRecipient);
    event StuckTokens(address indexed caller, uint indexed amount, address indexed token);

    // Tokens
    address public constant wftm = address(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83);
    address public constant equal = address(0x3Fd3A0c85B70754eFc07aC9Ac0cbBDCe664865A6);
    address public constant mpx = address(0x66eEd5FF1701E6ed8470DC391F05e27B1d0657eb);
    address internal constant usdc = address(0x04068DA6C83AFCFA0e13ba15A6696662335D5B75);  //vaultProfit denominator
    address public feeToken;      // Switch for which token protocol receives fees in. In mind for Native & Stable but fits any Equal - X token swap.
    address[] public rewardTokens;
    address[2] internal slippageTokens;
    address[2] internal slippageLPs;

    // 3rd party contracts
    address public gauge;
    address public router;

    // Xpandr addresses
    address public constant treasury = address(0xE37058057B0751bD2653fdeB27e8218439e0f726);
    address public feeRecipient;

    // Paths
    IEqualizerRouter.Routes[] public equalToWftmPath;
    IEqualizerRouter.Routes[] public equalToMpxPath;
    IEqualizerRouter.Routes[] public customPath;

    // Fee Structure
    uint64 public constant FEE_DIVISOR = 1000;
    uint64 public platformFee = 35;                         // 3.5% Platform fee cap
    uint64 public withdrawFee;                              // 0% withdraw fee. Logic kept in case spam/economic attacks bypass buffers, can only be set to 0 or 0.1%
    uint64 public treasuryFee = 590;
    uint64 public callFee = 120;
    uint64 public stratFee = 290;
    uint64 public recipientFee;

    // Controllers
    uint64 internal lastHarvest;                            // Safeguard only allows harvest being called if > delay
    uint64 public vaultProfit;                              // Excludes performance fees
    uint64 public delay;
    uint8 internal harvestOnDeposit;
    mapping(address => uint64) internal lastUserDeposit;    //Safeguard only allows same user deposits if > delay

    constructor(
        ERC20 _asset,
        address _gauge,
        address _router,
        address _feeToken,
        address _strategist,
        IEqualizerRouter.Routes[] memory _equalToWftmPath,
        IEqualizerRouter.Routes[] memory _equalToMpxPath
        )
       ERC4626(
            _asset,
            string(abi.encodePacked("Tester Vault")),
            string(abi.encodePacked("LP"))
        )
        {
        gauge = _gauge;
        router = _router;
        feeToken = _feeToken;
        strategist = _strategist;
        delay = 600; // 10 mins

        for (uint i; i < _equalToWftmPath.length;) {
            equalToWftmPath.push(_equalToWftmPath[i]);
            unchecked{++i;}
        }

        for (uint i; i < _equalToMpxPath.length;) {
            equalToMpxPath.push(_equalToMpxPath[i]);
            unchecked{++i;}
        }
        slippageTokens = [equal, wftm];
        slippageLPs = [address(0x3d6c56f6855b7Cc746fb80848755B0a9c3770122), address(_asset)];
        rewardTokens.push(equal);
        lastHarvest = _timestamp();
        _addAllowance();
    }

    /*//////////////////////////////////////////////////////////////
                          DEPOSIT/WITHDRAW
    //////////////////////////////////////////////////////////////*/

     function depositAll() external {
        deposit(asset.balanceOf(msg.sender), msg.sender);
    }

    // Deposit 'asset' into the vault which then deposits funds into the farm.
    function deposit(uint assets, address receiver) public override whenNotPaused returns (uint shares) {
        if(tx.origin != receiver){revert XpandrErrors.NotAccountOwner();}
        if(lastUserDeposit[receiver] != 0) {if(_timestamp() < lastUserDeposit[receiver] + delay) {revert XpandrErrors.UnderTimeLock();}}
        if(assets > asset.balanceOf(receiver)){revert XpandrErrors.OverCap();}
        shares = convertToShares(assets);
        if(assets == 0 || shares == 0){revert XpandrErrors.ZeroAmount();}

        lastUserDeposit[receiver] = _timestamp();
        emit Deposit(receiver, receiver, assets, shares);

        asset.safeTransferFrom(receiver, address(this), assets); // Need to transfer before minting or ERC777s could reenter.
        _mint(receiver, shares);
        _earn();

        if(harvestOnDeposit != 0) {afterDeposit(assets, shares);}
    }

    function withdrawAll() external {
        withdraw(ERC20(address(this)).balanceOf(msg.sender), msg.sender, msg.sender);
    }

    // Withdraw 'asset' from farm into vault & sends to receiver.
    function withdraw(uint shares, address receiver, address _owner) public override returns (uint assets) {
        if(tx.origin != receiver && tx.origin != _owner){revert XpandrErrors.NotAccountOwner();}
        if(shares > ERC20(address(this)).balanceOf(_owner)){revert XpandrErrors.OverCap();}
        assets = convertToAssets(shares);
        if(assets == 0 || shares == 0){revert XpandrErrors.ZeroAmount();}

        _burn(_owner, shares);
        emit Withdraw(_owner, receiver, _owner, assets, shares);
        _collect(assets);

        uint assetBal = asset.balanceOf(address(this));
        if (assetBal > assets) {assetBal = assets;}

        if(withdrawFee != 0){
            uint withdrawFeeAmt = assetBal * withdrawFee / FEE_DIVISOR;
            asset.safeTransfer(receiver, assetBal - withdrawFeeAmt);
        } else {asset.safeTransfer(receiver, assetBal);}
    }

    function harvest() external {
        if(msg.sender != tx.origin){revert XpandrErrors.NotEOA();}
        if(_timestamp() < lastHarvest + delay){revert XpandrErrors.UnderTimeLock();}
        _harvest(msg.sender);
    }

    function _harvest(address caller) internal whenNotPaused {
        lastHarvest = _timestamp();
        emit Harvest(caller);
        IEqualizerGauge(gauge).getReward(address(this), rewardTokens);
        uint outputBal = ERC20(equal).balanceOf(address(this));

        if (outputBal != 0 ) {
            _chargeFees(caller);
            _addLiquidity();
        }
        _earn();
    }

    /*//////////////////////////////////////////////////////////////
                             INTERNAL
    //////////////////////////////////////////////////////////////*/

    // Deposits funds in the farm
    function _earn() internal {
        uint assetBal = asset.balanceOf(address(this));
        IEqualizerGauge(gauge).deposit(assetBal);
    }

    // Withdraws funds from the farm
    function _collect(uint _amount) internal {
        uint assetBal = asset.balanceOf(address(this));
        if (assetBal < _amount) {
            IEqualizerGauge(gauge).withdraw(_amount - assetBal);
        }
    }

    function _chargeFees(address caller) internal {
        uint toFee = ERC20(equal).balanceOf(address(this)) * platformFee / FEE_DIVISOR;
        uint toProfit = ERC20(equal).balanceOf(address(this)) - toFee;

        (uint usdProfit,) = IEqualizerRouter(router).getAmountOut(toProfit, equal, usdc);
        vaultProfit = vaultProfit + uint64(usdProfit / 1e12);

        IEqualizerRouter(router).swapExactTokensForTokensSimple(toFee, 1, equal, feeToken, false, address(this), lastHarvest + 60);

        uint feeBal = ERC20(feeToken).balanceOf(address(this));

        uint callAmt = feeBal * callFee / FEE_DIVISOR;
        ERC20(feeToken).transfer(caller, callAmt);

        if(recipientFee != 0){
        uint recipientAmt = feeBal * recipientFee / FEE_DIVISOR;
        ERC20(feeToken).safeTransfer(feeRecipient, recipientAmt);
        }

        uint treasuryAmt = feeBal * treasuryFee / FEE_DIVISOR;
        ERC20(feeToken).transfer(treasury, treasuryAmt);

        uint stratAmt = feeBal * stratFee / FEE_DIVISOR;
        ERC20(feeToken).transfer(strategist, stratAmt);
    }

    function _addLiquidity() internal {
        uint equalHalf = ERC20(equal).balanceOf(address(this)) >> 1;
        (uint minAmt1, uint minAmt2) = slippage(equalHalf);
        IEqualizerRouter(router).swapExactTokensForTokens(equalHalf, minAmt1, equalToWftmPath, address(this), lastHarvest);
        IEqualizerRouter(router).swapExactTokensForTokens(equalHalf, minAmt2, equalToMpxPath, address(this), lastHarvest);

        uint t1Bal = ERC20(wftm).balanceOf(address(this));
        uint t2Bal = ERC20(mpx).balanceOf(address(this));
        IEqualizerRouter(router).addLiquidity(wftm, mpx, false, t1Bal, t2Bal, 1, 1, address(this), lastHarvest);
    }

    /*//////////////////////////////////////////////////////////////
                               VIEWS
    //////////////////////////////////////////////////////////////*/

    // Returns amount of reward in native upon calling the harvest function
    function callReward() public view returns (uint) {
        uint outputBal = rewardBalance();
        uint wrappedOut;
        if (outputBal != 0) {
            (wrappedOut,) = IEqualizerRouter(router).getAmountOut(outputBal, equal, wftm);
        }
        return wrappedOut * platformFee / FEE_DIVISOR * callFee / FEE_DIVISOR;
    }

    function idleFunds() external view returns (uint) {
        return asset.balanceOf(address(this));
    }

    // Returns total amount of 'asset' held by the vault and contracts it deposits in.
    function totalAssets() public view override returns (uint) {
        return asset.balanceOf(address(this)) + balanceOfPool();
    }

    //Return how much 'asset' the vault has working in the farm
    function balanceOfPool() public view returns (uint) {
        return IEqualizerGauge(gauge).balanceOf(address(this));
    }

    // Returns rewards unharvested
    function rewardBalance() public view returns (uint) {
        return IEqualizerGauge(gauge).earned(equal, address(this));
    }

    // Function for UIs to display the current value of 1 vault share
    function getPricePerFullShare() external view returns (uint) {
        return totalSupply == 0 ? 1e18 : totalAssets() * 1e18 / totalSupply;
    }

    function convertToShares(uint256 assets) public view override returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.
        return supply == 0 ? assets : assets.mulDivDown(supply, totalAssets());
    }

    function convertToAssets(uint256 shares) public view override returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.
        return supply == 0 ? shares : shares.mulDivDown(totalAssets(), supply);
    }

    /*//////////////////////////////////////////////////////////////
                             SECURITY
    //////////////////////////////////////////////////////////////*/

    // Pauses the vault & executes emergency withdraw
    function panic() external onlyAdmin {
        pause();
        emit Panic(msg.sender);
        IEqualizerGauge(gauge).withdraw(balanceOfPool());
    }

    function pause() public onlyAdmin {
        _pause();
        _subAllowance();
    }

    function unpause() external onlyAdmin {
        _unpause();
        _addAllowance();
        _earn();
    }

    //Guards against timestamp spoofing
    function _timestamp() internal view returns (uint64 timestamp){
        (,,uint lastBlock) = (IEqualizerPair(address(asset)).getReserves());
        timestamp = uint64(lastBlock + 1500);
    }

    //Guards against sandwich attacks
    function slippage(uint _amount) internal view returns(uint minAmt1, uint minAmt2){
        uint[] memory t1Amts = IEqualizerPair(slippageLPs[0]).sample(slippageTokens[0], _amount, 5, 2);

        for(uint i; i < t1Amts.length;){
            minAmt1 = minAmt1 + t1Amts[i];
            unchecked{++i;}
        }
        minAmt1 = (minAmt1 / 10);

        uint[] memory t2Amts = IEqualizerPair(slippageLPs[1]).sample(slippageTokens[1], minAmt1, 5, 2);
        minAmt1 = (minAmt1 - minAmt1 * 2) / 100;

        for(uint i; i < t2Amts.length;){
            minAmt2 = minAmt2 + t2Amts[i];
            unchecked{++i;}
        }
        minAmt2 = (minAmt2 / 10) - ((minAmt2 / 10) * 2 ) / 100;
    }

    /*//////////////////////////////////////////////////////////////
                               SETTERS
    //////////////////////////////////////////////////////////////*/

    function setFeesAndRecipient(uint64 _platformFee, uint64 _withdrawFee, uint64 _callFee, uint64 _stratFee, uint64 _treasuryFee, uint64 _recipientFee, address _recipient) external onlyOwner {
        if(_platformFee > 35){revert XpandrErrors.OverCap();}
        if(_withdrawFee != 0 || _withdrawFee != 1){revert XpandrErrors.OverCap();}
        uint64 sum = _callFee + _stratFee + _treasuryFee + _recipientFee;
        if(sum > FEE_DIVISOR){revert XpandrErrors.OverCap();}
        if(_recipient != address(0) && _recipient != feeRecipient){feeRecipient = _recipient;}

        platformFee = _platformFee;
        callFee = _callFee;
        stratFee = _stratFee;
        withdrawFee = _withdrawFee;
        treasuryFee = _treasuryFee;
        recipientFee = _recipientFee;
        emit SetFeesAndRecipient(withdrawFee, sum, feeRecipient);
    }

    function setRouterOrGauge(address _router, address _gauge) external onlyOwner {
        if(_router == address(0) || _gauge == address(0)){revert XpandrErrors.ZeroAddress();}
        if(_router != router){router = _router;}
        if(_gauge != gauge){gauge = _gauge;}
        emit SetRouterOrGauge(router, gauge);
    }

    function setPaths(IEqualizerRouter.Routes[] memory _equalToMpx, IEqualizerRouter.Routes[] memory _equalToWftm) external onlyAdmin{
        if(_equalToMpx.length != 0){
            for (uint i; i < _equalToMpx.length;) {
            equalToMpxPath.push(_equalToMpx[i]);
            unchecked{++i;}
            }
        }
        if(_equalToWftm.length != 0){
            for (uint i; i < _equalToWftm.length;) {
            equalToWftmPath.push(_equalToWftm[i]);
            unchecked{++i;}
            }
        }
        emit SetPaths(equalToMpxPath, equalToWftmPath);
    }

   function setFeeToken(address _feeToken) external onlyAdmin {
       if(_feeToken == address(0) || _feeToken == feeToken){revert XpandrErrors.InvalidTokenOrPath();}
       feeToken = _feeToken;
       emit SetFeeToken(_feeToken);

       ERC20(_feeToken).safeApprove(router, 0);
       ERC20(_feeToken).safeApprove(router, type(uint).max);
    }

    function setHarvestOnDeposit(uint8 _harvestOnDeposit) external onlyAdmin {
        if(_harvestOnDeposit != 0 || _harvestOnDeposit != 1){revert XpandrErrors.OverCap();}
        harvestOnDeposit = _harvestOnDeposit;
    }

    function setDelay(uint64 _delay) external onlyAdmin{
        if(_delay > 1800 || _delay < 600) {revert XpandrErrors.InvalidDelay();}
        delay = _delay;
    }

    /*//////////////////////////////////////////////////////////////
                               UTILS
    //////////////////////////////////////////////////////////////

    This function exists for cases where a vault may receive sporadic 3rd party rewards such as airdrop from it's deposit in a farm.
    Enables convert that token into more of this vault's reward. */
    function customTx(address _token, uint _amount, IEqualizerRouter.Routes[] memory _path) external onlyAdmin {
        if(_token == equal || _token == wftm || _token == mpx){revert XpandrErrors.InvalidTokenOrPath();}
        uint bal;
        if(_amount == 0) {bal = ERC20(_token).balanceOf(address(this));}
        else {bal = _amount;}

        for (uint i; i < _path.length;) {
            customPath.push(_path[i]);
            unchecked{++i;}
        }

        emit CustomTx(_token, bal);
        ERC20(_token).safeApprove(router, 0);
        ERC20(_token).safeApprove(router, type(uint).max);
        IEqualizerRouter(router).swapExactTokensForTokensSupportingFeeOnTransferTokens(bal, 1, customPath, address(this), _timestamp());
    }

    function _subAllowance() internal {
        asset.safeApprove(gauge, 0);
        ERC20(equal).safeApprove(router, 0);
        ERC20(wftm).safeApprove(router, 0);
        ERC20(mpx).safeApprove(router, 0);
    }

    function _addAllowance() internal {
        asset.safeApprove(gauge, type(uint).max);
        ERC20(equal).safeApprove(router, type(uint).max);
        ERC20(wftm).safeApprove(router, type(uint).max);
        ERC20(mpx).safeApprove(router, type(uint).max);
    }

    //ERC4626 hook. Called by deposit if harvestOnDeposit = 1. Args unused but part of spec
    function afterDeposit(uint assets, uint shares) internal override {
        _harvest(tx.origin);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract ERC20","name":"_asset","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_equalToWftmPath","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_equalToMpxPath","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidDelay","type":"error"},{"inputs":[],"name":"InvalidTokenOrPath","type":"error"},{"inputs":[],"name":"NoAuth","type":"error"},{"inputs":[],"name":"NotAccountOwner","type":"error"},{"inputs":[],"name":"NotEOA","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[],"name":"NotStrategist","type":"error"},{"inputs":[],"name":"OverCap","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"UnderTimeLock","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CustomTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"Panic","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeeToken","type":"address"}],"name":"SetFeeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"withdrawFee","type":"uint64"},{"indexed":true,"internalType":"uint64","name":"totalFees","type":"uint64"},{"indexed":true,"internalType":"address","name":"newRecipient","type":"address"}],"name":"SetFeesAndRecipient","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"indexed":true,"internalType":"struct IEqualizerRouter.Routes[]","name":"path1","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"indexed":true,"internalType":"struct IEqualizerRouter.Routes[]","name":"path2","type":"tuple[]"}],"name":"SetPaths","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRouter","type":"address"},{"indexed":true,"internalType":"address","name":"newGauge","type":"address"}],"name":"SetRouterOrGauge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newStrategist","type":"address"}],"name":"SetStrategist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"StuckTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"WasPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"customPath","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_path","type":"tuple[]"}],"name":"customTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"equal","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"equalToMpxPath","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"equalToWftmPath","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"idleFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mpx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipientFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_delay","type":"uint64"}],"name":"setDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeToken","type":"address"}],"name":"setFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_platformFee","type":"uint64"},{"internalType":"uint64","name":"_withdrawFee","type":"uint64"},{"internalType":"uint64","name":"_callFee","type":"uint64"},{"internalType":"uint64","name":"_stratFee","type":"uint64"},{"internalType":"uint64","name":"_treasuryFee","type":"uint64"},{"internalType":"uint64","name":"_recipientFee","type":"uint64"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"setFeesAndRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_harvestOnDeposit","type":"uint8"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_equalToMpx","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_equalToWftm","type":"tuple[]"}],"name":"setPaths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_gauge","type":"address"}],"name":"setRouterOrGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stratFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultProfit","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wftm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}]

610100604052601480547878000000000000024e000000000000000000000000000000236fffffffffffffffff0000000000000000909116179055601580546001600160401b0319166101221790553480156200005b57600080fd5b5060405162004bfc38038062004bfc8339810160408190526200007e9162000901565b6040516b15195cdd195c8815985d5b1d60a21b60208201528790602c0160408051601f19818403018152908290526104c560f41b6020830152906022016040516020818303038152906040528181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200010b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001319190620009d7565b60006200013f848262000a92565b5060016200014e838262000a92565b5060ff81166080524660a05262000164620004cc565b60c0525050506001600160a01b0390921660e0525050600680546001600160a01b03199081163390811790925560078054909116821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36007546040516001600160a01b03909116906000907f03aa7a3f25bf4594fe3353db7ca93b2dac0aec91d473f8a33e998b97405cd1fc908290a360078054600e80546001600160a01b03808b166001600160a01b031992831617909255600f80548a841690831617905560088054898416921691909117905585166001600160a81b0319909116179055601680546001600160401b03191661025817905560005b82518110156200030057601183828151811062000289576200028962000b5e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b031990931693909116929092171790550162000268565b5060005b81518110156200039c57601282828151811062000325576200032562000b5e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b031990931693909116929092171790550162000304565b5060408051808201909152733fd3a0c85b70754efc07ac9ac0cbbdce664865a681527321be370d5312f44cb42ce377bc9b8a0cef1a4c836020820152620003e890600a90600262000721565b5060408051808201909152733d6c56f6855b7cc746fb80848755b0a9c377012281526001600160a01b03881660208201526200042990600c90600262000721565b50600980546001810182556000919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b031916733fd3a0c85b70754efc07ac9ac0cbbdce664865a61790556200048a62000568565b601580546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620004bf620005ec565b5050505050505062000c49565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405162000500919062000b74565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060e0516001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015620005ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d2919062000bf2565b92505050806105dc620005e6919062000c21565b91505090565b600e5460e0516200060d916001600160a01b0391821691166000196200069f565b600f546200063d90733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906001600160a01b03166000196200069f565b600f546200066d907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906001600160a01b03166000196200069f565b600f546200069d907366eed5ff1701e6ed8470dc391f05e27b1d0657eb906001600160a01b03166000196200069f565b565b600060405163095ea7b360e01b8152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806200071b5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b604482015260640160405180910390fd5b50505050565b82600281019282156200076c579160200282015b828111156200076c57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000735565b506200077a9291506200077e565b5090565b5b808211156200077a57600081556001016200077f565b6001600160a01b0381168114620007ab57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620007e957620007e9620007ae565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200081a576200081a620007ae565b604052919050565b600082601f8301126200083457600080fd5b815160206001600160401b03821115620008525762000852620007ae565b62000862818360051b01620007ef565b828152606092830285018201928282019190878511156200088257600080fd5b8387015b85811015620008f45781818a031215620008a05760008081fd5b620008aa620007c4565b8151620008b78162000795565b815281860151620008c88162000795565b818701526040828101518015158114620008e25760008081fd5b90820152845292840192810162000886565b5090979650505050505050565b600080600080600080600060e0888a0312156200091d57600080fd5b87516200092a8162000795565b60208901519097506200093d8162000795565b6040890151909650620009508162000795565b6060890151909550620009638162000795565b6080890151909450620009768162000795565b60a08901519093506001600160401b03808211156200099457600080fd5b620009a28b838c0162000822565b935060c08a0151915080821115620009b957600080fd5b50620009c88a828b0162000822565b91505092959891949750929550565b600060208284031215620009ea57600080fd5b815160ff81168114620009fc57600080fd5b9392505050565b600181811c9082168062000a1857607f821691505b60208210810362000a3957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a8d57600081815260208120601f850160051c8101602086101562000a685750805b601f850160051c820191505b8181101562000a895782815560010162000a74565b5050505b505050565b81516001600160401b0381111562000aae5762000aae620007ae565b62000ac68162000abf845462000a03565b8462000a3f565b602080601f83116001811462000afe576000841562000ae55750858301515b600019600386901b1c1916600185901b17855562000a89565b600085815260208120601f198616915b8281101562000b2f5788860151825594840194600190910190840162000b0e565b508582101562000b4e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600080835462000b848162000a03565b6001828116801562000b9f576001811462000bb55762000be6565b60ff198416875282151583028701945062000be6565b8760005260208060002060005b8581101562000bdd5781548a82015290840190820162000bc2565b50505082870194505b50929695505050505050565b60008060006060848603121562000c0857600080fd5b8351925060208401519150604084015190509250925092565b8082018082111562000c4357634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c05160e051613f1e62000cde60003960008181610564015281816108f8015281816110cf0152818161121901528181611b8d01528181611c6d01528181611ca701528181611e0201528181612097015281816122a10152818161236e01528181612448015281816127e8015261291301526000610d3401526000610d04015260006105350152613f1e6000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c806377c7b8fc116101f4578063b460af941161011a578063de5f6268116100ad578063f2fde38b1161007c578063f2fde38b14610890578063f4a22de1146108a3578063f4f45b46146108ab578063f887ea40146108c657600080fd5b8063de5f626814610848578063e16c380f14610850578063e7c43a9214610863578063e941fa781461087657600080fd5b8063c7b9d530116100e9578063c7b9d530146107dd578063cc32d176146107f0578063cddff3b01461080a578063dd62ed3e1461081d57600080fd5b8063b460af9414610791578063b6ad0634146107a4578063c1073302146107b7578063c6e6f592146107ca57600080fd5b80638e645f89116101925780639e93ad8e116101615780639e93ad8e1461075a578063a6f19c8414610763578063a9059cbb14610776578063aa5c3ab41461078957600080fd5b80638e645f891461071d57806390321e1a1461073057806395d89b411461074a57806397fd323d1461075257600080fd5b80637f8721ca116101ce5780637f8721ca146106e05780638456cb59146106fa578063853828b6146107025780638da5cb5b1461070a57600080fd5b806377c7b8fc146106a55780637bb7bed1146106ad5780637ecebe00146106c057600080fd5b806338d52e0f116102e457806361d027b3116102775780636a42b8f8116102465780636a42b8f81461064c5780636e553f651461065f57806370a082311461067257806375ffc0101461069257600080fd5b806361d027b3146105f0578063647846a51461060b5780636940fba01461061e57806369989d9d1461063957600080fd5b806346904840116102b357806346904840146105b05780634700d305146105c35780635056bc61146105cb5780635c975abb146105de57600080fd5b806338d52e0f1461055f5780633f4ba83a1461058657806340bda4021461058e5780634641257d146105a857600080fd5b806318160ddd1161035c57806323b872dd1161032b57806323b872dd146104f257806326232a2e14610505578063313ce567146105305780633644e5151461055757600080fd5b806318160ddd146104685780631aa0e548146104715780631e228514146104ac5780631fe4a686146104df57600080fd5b8063095ea7b311610398578063095ea7b314610402578063115880861461042557806315cce2241461042d57806316c61ccc1461044257600080fd5b806301e1d114146103bf57806306fdde03146103da57806307a2d13a146103ef575b600080fd5b6103c76108d9565b6040519081526020015b60405180910390f35b6103e261097a565b6040516103d19190613626565b6103c76103fd366004613674565b610a08565b6104156104103660046136a9565b610a35565b60405190151581526020016103d1565b6103c7610aa2565b61044061043b3660046136d3565b610b10565b005b60075461045690600160a01b900460ff1681565b60405160ff90911681526020016103d1565b6103c760025481565b61048461047f366004613674565b610bda565b604080516001600160a01b0394851681529390921660208401521515908201526060016103d1565b6104c7733fd3a0c85b70754efc07ac9ac0cbbdce664865a681565b6040516001600160a01b0390911681526020016103d1565b6007546104c7906001600160a01b031681565b6104156105003660046136ee565b610c20565b601454610518906001600160401b031681565b6040516001600160401b0390911681526020016103d1565b6104567f000000000000000000000000000000000000000000000000000000000000000081565b6103c7610d00565b6104c77f000000000000000000000000000000000000000000000000000000000000000081565b610440610d56565b60155461051890600160401b90046001600160401b031681565b610440610d78565b6010546104c7906001600160a01b031681565b610440610dfd565b6104406105d936600461372a565b610ea3565b600754600160a01b900460ff16610456565b6104c773e37058057b0751bd2653fdeb27e8218439e0f72681565b6008546104c7906001600160a01b031681565b6104c77366eed5ff1701e6ed8470dc391f05e27b1d0657eb81565b61044061064736600461374d565b610f03565b601654610518906001600160401b031681565b6103c761066d366004613780565b610feb565b6103c76106803660046136d3565b60036020526000908152604090205481565b6104406106a03660046137ba565b61126f565b6103c76114e0565b6104c76106bb366004613674565b611520565b6103c76106ce3660046136d3565b60056020526000908152604090205481565b60155461051890600160c01b90046001600160401b031681565b61044061154a565b610440611562565b6006546104c7906001600160a01b031681565b61044061072b36600461398f565b6115cc565b60145461051890600160c01b90046001600160401b031681565b6103e2611857565b6103c7611864565b6105186103e881565b600e546104c7906001600160a01b031681565b6104156107843660046136a9565b611968565b6103c76119ce565b6103c761079f3660046139e5565b611a19565b601554610518906001600160401b031681565b6104406107c5366004613a21565b611cd6565b6103c76107d8366004613674565b611d42565b6104406107eb3660046136d3565b611d62565b60145461051890600160801b90046001600160401b031681565b610484610818366004613674565b611dd9565b6103c761082b36600461374d565b600460209081526000928352604080842090915290825290205481565b610440611de9565b61044061085e366004613a3c565b611e7b565b610484610871366004613674565b61201b565b60145461051890600160401b90046001600160401b031681565b61044061089e3660046136d3565b61202b565b6103c761207f565b6104c77321be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b600f546104c7906001600160a01b031681565b60006108e3610aa2565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610947573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096b9190613a9f565b6109759190613ace565b905090565b6000805461098790613ae1565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390613ae1565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b505050505081565b6002546000908015610a2c57610a27610a1f6108d9565b8490836120ce565b610a2e565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a909086815260200190565b60405180910390a35060015b92915050565b600e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024015b602060405180830381865afa158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109759190613a9f565b610b186120ec565b6001600160a01b0381161580610b3b57506008546001600160a01b038281169116145b15610b5957604051637daf14b960e11b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040517f0842bcbb92ca6d47ae89816778a843992dff9b876fad009865e1c5df73d46d1f90600090a2600f54610bbb906001600160a01b038381169116600061212f565b600f54610bd7906001600160a01b03838116911660001961212f565b50565b60118181548110610bea57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03918216925090811690600160a01b900460ff1683565b6001600160a01b03831660009081526004602090815260408083203384529091528120546000198114610c7c57610c578382613b1b565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290610ca4908490613b1b565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020613ec983398151915290610ced9087815260200190565b60405180910390a3506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610d31576109756121ab565b507f000000000000000000000000000000000000000000000000000000000000000090565b610d5e6120ec565b610d66612245565b610d6e612290565b610d76612356565b565b333214610d9857604051635d04968b60e11b815260040160405180910390fd5b601654601554610dbb916001600160401b0390811691600160801b900416613b2e565b6001600160401b0316610dcc612443565b6001600160401b03161015610df45760405163cba1549360e01b815260040160405180910390fd5b610d76336124e0565b610e056120ec565b610e0d61154a565b60405133907fa0281c9359a6afac738fb86a45f94a2482ed1f0bfbdf7ce5ef88046acf47160c90600090a2600e546001600160a01b0316632e1a7d4d610e51610aa2565b6040518263ffffffff1660e01b8152600401610e6f91815260200190565b600060405180830381600087803b158015610e8957600080fd5b505af1158015610e9d573d6000803e3d6000fd5b50505050565b610eab6120ec565b60ff8116151580610ec057508060ff16600114155b15610ede5760405163342fa66d60e01b815260040160405180910390fd5b6016805460ff909216600160401b0268ff000000000000000019909216919091179055565b610f0b612650565b6001600160a01b0382161580610f2857506001600160a01b038116155b15610f465760405163d92e233d60e01b815260040160405180910390fd5b600f546001600160a01b03838116911614610f7757600f80546001600160a01b0319166001600160a01b0384161790555b600e546001600160a01b03828116911614610fa857600e80546001600160a01b0319166001600160a01b0383161790555b600e54600f546040516001600160a01b0392831692909116907f8b3031f0f8cd174261d286f87b17642361e59c9a806d90edfcab16be87521cf890600090a35050565b6000610ff561267b565b326001600160a01b0383161461101e5760405163fcfdb9b560e01b815260040160405180910390fd5b6001600160a01b0382166000908152601760205260409020546001600160401b0316156110b0576016546001600160a01b038316600090815260176020526040902054611077916001600160401b039081169116613b2e565b6001600160401b0316611088612443565b6001600160401b031610156110b05760405163cba1549360e01b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113a9190613a9f565b83111561115a5760405163342fa66d60e01b815260040160405180910390fd5b61116383611d42565b9050821580611170575080155b1561118e57604051631f2a200560e01b815260040160405180910390fd5b611196612443565b6001600160a01b038316600081815260176020908152604091829020805467ffffffffffffffff19166001600160401b0395909516949094179093558051868152928301849052909182917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36112416001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168330866126a6565b61124b8282612729565b611253612356565b601654600160401b900460ff1615610a9c57610a9c8382612783565b611277612650565b6023876001600160401b031611156112a25760405163342fa66d60e01b815260040160405180910390fd5b6001600160401b0386161515806112c35750856001600160401b0316600114155b156112e15760405163342fa66d60e01b815260040160405180910390fd5b600082846112ef8789613b2e565b6112f99190613b2e565b6113039190613b2e565b90506103e86001600160401b03821611156113315760405163342fa66d60e01b815260040160405180910390fd5b6001600160a01b0382161580159061135757506010546001600160a01b03838116911614155b1561137857601080546001600160a01b0319166001600160a01b0384161790555b87601460006101000a8154816001600160401b0302191690836001600160401b0316021790555085601460186101000a8154816001600160401b0302191690836001600160401b0316021790555084601560006101000a8154816001600160401b0302191690836001600160401b0316021790555086601460086101000a8154816001600160401b0302191690836001600160401b0316021790555083601460106101000a8154816001600160401b0302191690836001600160401b0316021790555082601560086101000a8154816001600160401b0302191690836001600160401b03160217905550601060009054906101000a90046001600160a01b03166001600160a01b0316816001600160401b0316601460089054906101000a90046001600160401b03166001600160401b03167f93556f00d8b8f319e3516a48ab333665a8f50701dff4b81b788ffe071f49eec160405160405180910390a45050505050505050565b6000600254600014611513576002546114f76108d9565b61150990670de0b6b3a7640000613b55565b6109759190613b6c565b50670de0b6b3a764000090565b6009818154811061153057600080fd5b6000918252602090912001546001600160a01b0316905081565b6115526120ec565b61155a61278c565b610d766127d7565b6040516370a0823160e01b8152336004820152610bd79030906370a0823190602401602060405180830381865afa1580156115a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c59190613a9f565b3333611a19565b6115d46120ec565b6001600160a01b038316733fd3a0c85b70754efc07ac9ac0cbbdce664865a6148061161b57506001600160a01b0383167321be370d5312f44cb42ce377bc9b8a0cef1a4c83145b8061164257506001600160a01b0383167366eed5ff1701e6ed8470dc391f05e27b1d0657eb145b1561166057604051637daf14b960e11b815260040160405180910390fd5b6000826000036116d9576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d29190613a9f565b90506116dc565b50815b60005b82518110156117725760138382815181106116fc576116fc613b8e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b03199093169390911692909217179055016116df565b5060405181906001600160a01b038616907f2212e80f309574493dff7fb06c8e36c69accb8120969523a90079d38cfe3dd6690600090a3600f546117c4906001600160a01b038681169116600061212f565b600f546117e0906001600160a01b03868116911660001961212f565b600f546001600160a01b0316636cc1ae138260016013306117ff612443565b6040518663ffffffff1660e01b815260040161181f959493929190613c0e565b600060405180830381600087803b15801561183957600080fd5b505af115801561184d573d6000803e3d6000fd5b5050505050505050565b6001805461098790613ae1565b60008061186f6119ce565b90506000811561191d57600f54604051635e1e632560e01b815260048101849052733fd3a0c85b70754efc07ac9ac0cbbdce664865a660248201527321be370d5312f44cb42ce377bc9b8a0cef1a4c8360448201526001600160a01b0390911690635e1e6325906064016040805180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119199190613c58565b5090505b6014546103e8906001600160401b03600160c01b82048116918391611943911685613b55565b61194d9190613b6c565b6119579190613b55565b6119619190613b6c565b9250505090565b33600090815260036020526040812080548391908390611989908490613b1b565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020613ec983398151915290610a909086815260200190565b600e5460405163211dc32d60e01b8152733fd3a0c85b70754efc07ac9ac0cbbdce664865a660048201523060248201526000916001600160a01b03169063211dc32d90604401610acf565b6000326001600160a01b03841614801590611a3d5750326001600160a01b03831614155b15611a5b5760405163fcfdb9b560e01b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b038316600482015230906370a0823190602401602060405180830381865afa158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac39190613a9f565b841115611ae35760405163342fa66d60e01b815260040160405180910390fd5b611aec84610a08565b9050801580611af9575083155b15611b1757604051631f2a200560e01b815260040160405180910390fd5b611b218285612899565b60408051828152602081018690526001600160a01b03808516929086169183917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a4611b75816128fb565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190613a9f565b905081811115611c0d5750805b601454600160401b90046001600160401b031615611c9a576014546000906103e890611c4990600160401b90046001600160401b031684613b55565b611c539190613b6c565b9050611c9485611c638385613b1b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906129ff565b50611cce565b611cce6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685836129ff565b509392505050565b611cde6120ec565b610708816001600160401b03161180611d015750610258816001600160401b0316105b15611d1f576040516327df2edd60e11b815260040160405180910390fd5b6016805467ffffffffffffffff19166001600160401b0392909216919091179055565b6002546000908015610a2c57610a2781611d5a6108d9565b8591906120ce565b6007546001600160a01b03163314611d8d57604051633163ba6d60e11b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907f03aa7a3f25bf4594fe3353db7ca93b2dac0aec91d473f8a33e998b97405cd1fc90600090a350565b60138181548110610bea57600080fd5b6040516370a0823160e01b8152336004820152610bd7907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190613a9f565b33610feb565b611e836120ec565b815115611f225760005b8251811015611f20576012838281518110611eaa57611eaa613b8e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b0319909316939091169290921717905501611e8d565b505b805115611fc15760005b8151811015611fbf576011828281518110611f4957611f49613b8e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b0319909316939091169290921717905501611f2c565b505b6011604051611fd09190613c88565b60405180910390206012604051611fe79190613c88565b604051908190038120907f13677c09f2b66a2d8b72275f0444cf65133d3637b6928cca9f66b7e925d42dd990600090a35050565b60128181548110610bea57600080fd5b612033612650565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401610acf565b60008260001904841183021582026120e557600080fd5b5091020490565b6006546001600160a01b03163314158061211157506007546001600160a01b03163314155b15610d765760405163518d568f60e11b815260040160405180910390fd5b600060405163095ea7b360e01b8152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610e9d5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b60448201526064015b60405180910390fd5b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516121dd9190613cef565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b61224d612a77565b6007805460ff60a01b191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600e546122cc906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911660001961212f565b600f546122fa90733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906001600160a01b031660001961212f565b600f54612328907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906001600160a01b031660001961212f565b600f54610d76907366eed5ff1701e6ed8470dc391f05e27b1d0657eb906001600160a01b031660001961212f565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156123bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e19190613a9f565b600e5460405163b6b55f2560e01b8152600481018390529192506001600160a01b03169063b6b55f2590602401600060405180830381600087803b15801561242857600080fd5b505af115801561243c573d6000803e3d6000fd5b5050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156124a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c89190613d8e565b92505050806105dc6124da9190613ace565b91505090565b6124e861267b565b6124f0612443565b601580546001600160401b0392909216600160801b0267ffffffffffffffff60801b199092169190911790556040516001600160a01b038216907f188a622567eeca997c3d494fd65f76ca910b90a50a0c44d5e37b2ea5539e027b90600090a2600e546040516331279d3d60e01b81526001600160a01b03909116906331279d3d90612583903090600990600401613dbc565b600060405180830381600087803b15801561259d57600080fd5b505af11580156125b1573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260009250733fd3a0c85b70754efc07ac9ac0cbbdce664865a691506370a0823190602401602060405180830381865afa158015612607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262b9190613a9f565b905080156126445761263c82612aa7565b612644613098565b61264c612356565b5050565b6006546001600160a01b03163314610d765760405163518d568f60e11b815260040160405180910390fd5b600754600160a01b900460ff1615610d76576040516313d0ff5960e31b815260040160405180910390fd5b60006040516323b872dd60e01b81528460048201528360248201528260448201526020600060648360008a5af13d15601f3d116001600051141617169150508061243c5760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016121a2565b806002600082825461273b9190613ace565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020613ec983398151915291015b60405180910390a35050565b61264c326124e0565b61279461267b565b6007805460ff60a01b1916600160a01b1790556040513381527f0ffc06e772e88e14988dce23e839899164e7a0fca52ac2179c86ae816b955a9990602001612286565b600e54612812906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116600061212f565b600f5461283f90733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906001600160a01b0316600061212f565b600f5461286c907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906001600160a01b0316600061212f565b600f54610d76907366eed5ff1701e6ed8470dc391f05e27b1d0657eb906001600160a01b0316600061212f565b6001600160a01b038216600090815260036020526040812080548392906128c1908490613b1b565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020613ec983398151915290602001612777565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129869190613a9f565b90508181101561264c57600e546001600160a01b0316632e1a7d4d6129ab8385613b1b565b6040518263ffffffff1660e01b81526004016129c991815260200190565b600060405180830381600087803b1580156129e357600080fd5b505af11580156129f7573d6000803e3d6000fd5b505050505050565b600060405163a9059cbb60e01b8152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610e9d5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016121a2565b600754600160a01b900460ff1660ff16600114610d7657604051636cd6020160e01b815260040160405180910390fd5b6014546040516370a0823160e01b81523060048201526000916103e8916001600160401b0390911690733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906370a0823190602401602060405180830381865afa158015612b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b309190613a9f565b612b3a9190613b55565b612b449190613b6c565b6040516370a0823160e01b81523060048201529091506000908290733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906370a0823190602401602060405180830381865afa158015612b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbf9190613a9f565b612bc99190613b1b565b600f54604051635e1e632560e01b815260048101839052733fd3a0c85b70754efc07ac9ac0cbbdce664865a660248201527304068da6c83afcfa0e13ba15a6696662335d5b7560448201529192506000916001600160a01b0390911690635e1e6325906064016040805180830381865afa158015612c4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6f9190613c58565b509050612c8164e8d4a5100082613b6c565b601554612c9e9190600160c01b90046001600160401b0316613b2e565b601580546001600160c01b0316600160c01b6001600160401b03938416021790819055600f546008546001600160a01b03918216936313dcfc59938893600193733fd3a0c85b70754efc07ac9ac0cbbdce664865a6939116916000913091612d1091600160801b90910416603c613b2e565b6040516001600160e01b031960e08a901b168152600481019790975260248701959095526001600160a01b0393841660448701529183166064860152151560848501521660a48301526001600160401b031660c482015260e4016000604051808303816000875af1158015612d89573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612db19190810190613e1b565b506008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1f9190613a9f565b6014549091506000906103e890612e4690600160c01b90046001600160401b031684613b55565b612e509190613b6c565b60085460405163a9059cbb60e01b81526001600160a01b0389811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015612ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec99190613eab565b50601554600160401b90046001600160401b031615612f32576015546000906103e890612f0690600160401b90046001600160401b031685613b55565b612f109190613b6c565b601054600854919250612f30916001600160a01b039081169116836129ff565b505b6014546000906103e890612f5690600160801b90046001600160401b031685613b55565b612f609190613b6c565b60085460405163a9059cbb60e01b815273e37058057b0751bd2653fdeb27e8218439e0f7266004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015612fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fea9190613eab565b506015546000906103e890613008906001600160401b031686613b55565b6130129190613b6c565b60085460075460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af1158015613069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308d9190613eab565b505050505050505050565b6040516370a0823160e01b8152306004820152600090600190733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906370a0823190602401602060405180830381865afa1580156130ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131119190613a9f565b901c90506000806131218361341d565b600f54601554604051631e82ecdb60e31b81529395509193506001600160a01b03169163f41766d89161317191879187916011913091600160801b9091046001600160401b031690600401613c0e565b6000604051808303816000875af1158015613190573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131b89190810190613e1b565b50600f54601554604051631e82ecdb60e31b81526001600160a01b039092169163f41766d89161320591879186916012913091600160801b9091046001600160401b031690600401613c0e565b6000604051808303816000875af1158015613224573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261324c9190810190613e1b565b506040516370a0823160e01b81523060048201526000907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906370a0823190602401602060405180830381865afa15801561329f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c39190613a9f565b6040516370a0823160e01b81523060048201529091506000907366eed5ff1701e6ed8470dc391f05e27b1d0657eb906370a0823190602401602060405180830381865afa158015613318573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333c9190613a9f565b600f54601554604051635a47ddc360e01b81527321be370d5312f44cb42ce377bc9b8a0cef1a4c8360048201527366eed5ff1701e6ed8470dc391f05e27b1d0657eb6024820152600060448201526064810186905260848101849052600160a4820181905260c48201523060e4820152600160801b9091046001600160401b03166101048201529192506001600160a01b031690635a47ddc390610124016060604051808303816000875af11580156133f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184d9190613d8e565b600c54600a546040516313345fe160e01b81526001600160a01b039182166004820152602481018490526005604482015260026064820152600092839283929116906313345fe190608401600060405180830381865afa158015613485573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134ad9190810190613e1b565b905060005b81518110156134ea578181815181106134cd576134cd613b8e565b6020026020010151846134e09190613ace565b93506001016134b2565b506134f6600a84613b6c565b600d54600b546040516313345fe160e01b81526001600160a01b0391821660048201526024810184905260056044820152600260648201529295506000929116906313345fe190608401600060405180830381865afa15801561355d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135859190810190613e1b565b90506064613594856002613b55565b61359e9086613b1b565b6135a89190613b6c565b935060005b81518110156135e5578181815181106135c8576135c8613b8e565b6020026020010151846135db9190613ace565b93506001016135ad565b5060646135f3600a85613b6c565b6135fe906002613b55565b6136089190613b6c565b613613600a85613b6c565b61361d9190613b1b565b92505050915091565b600060208083528351808285015260005b8181101561365357858101830151858201604001528201613637565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561368657600080fd5b5035919050565b80356001600160a01b03811681146136a457600080fd5b919050565b600080604083850312156136bc57600080fd5b6136c58361368d565b946020939093013593505050565b6000602082840312156136e557600080fd5b610a2e8261368d565b60008060006060848603121561370357600080fd5b61370c8461368d565b925061371a6020850161368d565b9150604084013590509250925092565b60006020828403121561373c57600080fd5b813560ff81168114610a2e57600080fd5b6000806040838503121561376057600080fd5b6137698361368d565b91506137776020840161368d565b90509250929050565b6000806040838503121561379357600080fd5b823591506137776020840161368d565b80356001600160401b03811681146136a457600080fd5b600080600080600080600060e0888a0312156137d557600080fd5b6137de886137a3565b96506137ec602089016137a3565b95506137fa604089016137a3565b9450613808606089016137a3565b9350613816608089016137a3565b925061382460a089016137a3565b915061383260c0890161368d565b905092959891949750929550565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561387857613878613840565b60405290565b604051601f8201601f191681016001600160401b03811182821017156138a6576138a6613840565b604052919050565b60006001600160401b038211156138c7576138c7613840565b5060051b60200190565b8015158114610bd757600080fd5b600082601f8301126138f057600080fd5b81356020613905613900836138ae565b61387e565b8281526060928302850182019282820191908785111561392457600080fd5b8387015b858110156139825781818a0312156139405760008081fd5b613948613856565b6139518261368d565b815261395e86830161368d565b86820152604080830135613971816138d1565b908201528452928401928101613928565b5090979650505050505050565b6000806000606084860312156139a457600080fd5b6139ad8461368d565b92506020840135915060408401356001600160401b038111156139cf57600080fd5b6139db868287016138df565b9150509250925092565b6000806000606084860312156139fa57600080fd5b83359250613a0a6020850161368d565b9150613a186040850161368d565b90509250925092565b600060208284031215613a3357600080fd5b610a2e826137a3565b60008060408385031215613a4f57600080fd5b82356001600160401b0380821115613a6657600080fd5b613a72868387016138df565b93506020850135915080821115613a8857600080fd5b50613a95858286016138df565b9150509250929050565b600060208284031215613ab157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a9c57610a9c613ab8565b600181811c90821680613af557607f821691505b602082108103613b1557634e487b7160e01b600052602260045260246000fd5b50919050565b81810381811115610a9c57610a9c613ab8565b6001600160401b03818116838216019080821115613b4e57613b4e613ab8565b5092915050565b8082028115828204841417610a9c57610a9c613ab8565b600082613b8957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000815480845260208085019450836000528060002060005b83811015613c035781546001600160a01b039081168852600183810154918216858a015260a09190911c60ff161515604089015260609097019660029092019101613bbd565b509495945050505050565b85815284602082015260a060408201526000613c2d60a0830186613ba4565b6001600160a01b03949094166060830152506001600160401b03919091166080909101529392505050565b60008060408385031215613c6b57600080fd5b825191506020830151613c7d816138d1565b809150509250929050565b60008183548391508460005260208060002060005b83811015613ce35781546001600160a01b0390811686526001838101549182168588015260a09190911c60ff161515604087015260609095019460029092019101613c9d565b50929695505050505050565b600080835481600182811c915080831680613d0b57607f831692505b60208084108203613d2a57634e487b7160e01b86526022600452602486fd5b818015613d3e5760018114613d5357613d80565b60ff1986168952841515850289019650613d80565b60008a81526020902060005b86811015613d785781548b820152908501908301613d5f565b505084890196505b509498975050505050505050565b600080600060608486031215613da357600080fd5b8351925060208401519150604084015190509250925092565b60006040820160018060a01b03808616845260206040818601528286548085526060870191508760005282600020945060005b81811015613e0d578554851683526001958601959284019201613def565b509098975050505050505050565b60006020808385031215613e2e57600080fd5b82516001600160401b03811115613e4457600080fd5b8301601f81018513613e5557600080fd5b8051613e63613900826138ae565b81815260059190911b82018301908381019087831115613e8257600080fd5b928401925b82841015613ea057835182529284019290840190613e87565b979650505050505050565b600060208284031215613ebd57600080fd5b8151610a2e816138d156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207909f9013660b9bcf0f3e6cfb23314b98fd3d636e9b45aee7765ffa6d98158e564736f6c63430008130033000000000000000000000000de26e98d868fe02fffb6df26e638995124d3ca1300000000000000000000000027f7cf5e918311aaf5e7185b5bcdac158dfacf530000000000000000000000002aa07920e4ecb4ea8c801d9dfece63875623b28500000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000003c173f1baf9f97bf244796c0179952a6a2e9c24800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8300000000000000000000000066eed5ff1701e6ed8470dc391f05e27b1d0657eb0000000000000000000000000000000000000000000000000000000000000000

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

000000000000000000000000de26e98d868fe02fffb6df26e638995124d3ca1300000000000000000000000027f7cf5e918311aaf5e7185b5bcdac158dfacf530000000000000000000000002aa07920e4ecb4ea8c801d9dfece63875623b28500000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000003c173f1baf9f97bf244796c0179952a6a2e9c24800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8300000000000000000000000066eed5ff1701e6ed8470dc391f05e27b1d0657eb0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _asset (address): 0xde26e98d868fe02fffb6df26e638995124d3ca13
Arg [1] : _gauge (address): 0x27f7cf5e918311aaf5e7185b5bcdac158dfacf53
Arg [2] : _router (address): 0x2aa07920e4ecb4ea8c801d9dfece63875623b285
Arg [3] : _feeToken (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [4] : _strategist (address): 0x3c173f1baf9f97bf244796c0179952a6a2e9c248
Arg [5] : _equalToWftmPath (tuple[]): System.Object
Arg [6] : _equalToMpxPath (tuple[]): System.Object,System.Object

-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 000000000000000000000000de26e98d868fe02fffb6df26e638995124d3ca13
Arg [1] : 00000000000000000000000027f7cf5e918311aaf5e7185b5bcdac158dfacf53
Arg [2] : 0000000000000000000000002aa07920e4ecb4ea8c801d9dfece63875623b285
Arg [3] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [4] : 0000000000000000000000003c173f1baf9f97bf244796c0179952a6a2e9c248
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 0000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
Arg [9] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 0000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
Arg [13] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [16] : 00000000000000000000000066eed5ff1701e6ed8470dc391f05e27b1d0657eb
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

31940:17698:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42175:133;;;:::i;:::-;;;160:25:1;;;148:2;133:18;42175:133:0;;;;;;;;6671:18;;;:::i;:::-;;;;;;;:::i;43181:260::-;;;;;;:::i;:::-;;:::i;8148:217::-;;;;;;:::i;:::-;;:::i;:::-;;;1536:14:1;;1529:22;1511:41;;1499:2;1484:18;8148:217:0;1371:187:1;42381:125:0;;;:::i;47034:351::-;;;;;;:::i;:::-;;:::i;:::-;;3358:20;;;;;-1:-1:-1;;;3358:20:0;;;;;;;;;1926:4:1;1914:17;;;1896:36;;1884:2;1869:18;3358:20:0;1754:184:1;6954:26:0;;;;;;33796:48;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;2195:15:1;;;2177:34;;2247:15;;;;2242:2;2227:18;;2220:43;2306:14;2299:22;2279:18;;;2272:50;2127:2;2112:18;33796:48:0;1943:385:1;32979:83:0;;33019:42;32979:83;;;;;-1:-1:-1;;;;;2497:32:1;;;2479:51;;2467:2;2452:18;32979:83:0;2333:203:1;854:25:0;;;;;-1:-1:-1;;;;;854:25:0;;;8766:612;;;;;;:::i;:::-;;:::i;34027:30::-;;;;;-1:-1:-1;;;;;34027:30:0;;;;;;-1:-1:-1;;;;;3036:31:1;;;3018:50;;3006:2;2991:18;34027:30:0;2874:200:1;6727:31:0;;;;;11108:179;;;:::i;21904:28::-;;;;;43942:111;;;:::i;34387:26::-;;;;;-1:-1:-1;;;34387:26:0;;-1:-1:-1;;;;;34387:26:0;;;38329:221;;;:::i;33746:27::-;;;;;-1:-1:-1;;;;;33746:27:0;;;43685:154;;;:::i;47393:222::-;;;;;;:::i;:::-;;:::i;4125:87::-;4197:7;;-1:-1:-1;;;4197:7:0;;;;4125:87;;33653:86;;33696:42;33653:86;;33275:23;;;;;-1:-1:-1;;;;;33275:23:0;;;33069:81;;33107:42;33069:81;;46105:324;;;;;;:::i;:::-;;:::i;34650:19::-;;;;;-1:-1:-1;;;;;34650:19:0;;;36337:881;;;;;;:::i;:::-;;:::i;6989:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;45241:856;;;;;;:::i;:::-;;:::i;42758:147::-;;;:::i;33426:29::-;;;;;;:::i;:::-;;:::i;7415:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;34560:25;;;;;-1:-1:-1;;;34560:25:0;;-1:-1:-1;;;;;34560:25:0;;;43847:87;;;:::i;37226:127::-;;;:::i;827:20::-;;;;;-1:-1:-1;;;;;827:20:0;;;48177:755;;;;;;:::i;:::-;;:::i;34318:27::-;;;;;-1:-1:-1;;;34318:27:0;;-1:-1:-1;;;;;34318:27:0;;;6698:20;;;:::i;41625:340::-;;;:::i;33979:41::-;;34016:4;33979:41;;33571:20;;;;;-1:-1:-1;;;;;33571:20:0;;;8373:385;;;;;;:::i;:::-;;:::i;42550:129::-;;;:::i;37428:893::-;;;;;;:::i;:::-;;:::i;34352:28::-;;;;;-1:-1:-1;;;;;34352:28:0;;;47623:165;;;;;;:::i;:::-;;:::i;42913:260::-;;;;;;:::i;:::-;;:::i;1798:226::-;;;;;;:::i;:::-;;:::i;34280:31::-;;;;;-1:-1:-1;;;34280:31:0;;-1:-1:-1;;;;;34280:31:0;;;33905:43;;;;;;:::i;:::-;;:::i;7042:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;36151:98;;;:::i;46437:590::-;;;;;;:::i;:::-;;:::i;33851:47::-;;;;;;:::i;:::-;;:::i;34113:25::-;;;;;-1:-1:-1;;;34113:25:0;;-1:-1:-1;;;;;34113:25:0;;;1625:165;;;;;;:::i;:::-;;:::i;41973:106::-;;;:::i;32890:82::-;;32929:42;32890:82;;33598:21;;;;;-1:-1:-1;;;;;33598:21:0;;;42175:133;42228:4;42285:15;:13;:15::i;:::-;42252:30;;-1:-1:-1;;;42252:30:0;;42276:4;42252:30;;;2479:51:1;42252:5:0;-1:-1:-1;;;;;42252:15:0;;;;2452:18:1;;42252:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;42245:55;;42175:133;:::o;6671:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43181:260::-;43289:11;;43252:7;;43370:11;;:63;;43393:40;43411:13;:11;:13::i;:::-;43393:6;;43426;43393:17;:40::i;:::-;43370:63;;;43384:6;43370:63;43363:70;43181:260;-1:-1:-1;;;43181:260:0:o;8148:217::-;8249:10;8222:4;8239:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;8239:30:0;;;;;;;;;;:39;;;8296:37;8222:4;;8239:30;;8296:37;;;;8272:6;160:25:1;;148:2;133:18;;14:177;8296:37:0;;;;;;;;-1:-1:-1;8353:4:0;8148:217;;;;;:::o;42381:125::-;42467:5;;42451:47;;-1:-1:-1;;;42451:47:0;;42492:4;42451:47;;;2479:51:1;42427:4:0;;-1:-1:-1;;;;;42467:5:0;;42451:32;;2452:18:1;;42451:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47034:351::-;1008:12;:10;:12::i;:::-;-1:-1:-1;;;;;47106:23:0;::::1;::::0;;:48:::1;;-1:-1:-1::0;47146:8:0::1;::::0;-1:-1:-1;;;;;47133:21:0;;::::1;47146:8:::0;::::1;47133:21;47106:48;47103:95;;;47163:33;;-1:-1:-1::0;;;47163:33:0::1;;;;;;;;;;;47103:95;47207:8;:20:::0;;-1:-1:-1;;;;;;47207:20:0::1;-1:-1:-1::0;;;;;47207:20:0;::::1;::::0;;::::1;::::0;;;47242:22:::1;::::0;::::1;::::0;-1:-1:-1;;47242:22:0::1;47305:6;::::0;47276:39:::1;::::0;-1:-1:-1;;;;;47276:28:0;;::::1;::::0;47305:6:::1;;47276:28;:39::i;:::-;47354:6;::::0;47325:52:::1;::::0;-1:-1:-1;;;;;47325:28:0;;::::1;::::0;47354:6:::1;-1:-1:-1::0;;47325:28:0::1;:52::i;:::-;47034:351:::0;:::o;33796:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33796:48:0;;;;-1:-1:-1;33796:48:0;;;;-1:-1:-1;;;33796:48:0;;;;;:::o;8766:612::-;-1:-1:-1;;;;;8923:15:0;;8888:4;8923:15;;;:9;:15;;;;;;;;8939:10;8923:27;;;;;;;;-1:-1:-1;;9003:28:0;;8999:80;;9063:16;9073:6;9063:7;:16;:::i;:::-;-1:-1:-1;;;;;9033:15:0;;;;;;:9;:15;;;;;;;;9049:10;9033:27;;;;;;;:46;8999:80;-1:-1:-1;;;;;9092:15:0;;;;;;:9;:15;;;;;:25;;9111:6;;9092:15;:25;;9111:6;;9092:25;:::i;:::-;;;;-1:-1:-1;;;;;;;9268:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;9320:26;9268:13;;9320:26;;;-1:-1:-1;;;;;;;;;;;9320:26:0;;;9285:6;160:25:1;;148:2;133:18;;14:177;9320:26:0;;;;;;;;-1:-1:-1;9366:4:0;;8766:612;-1:-1:-1;;;;8766:612:0:o;11108:179::-;11165:7;11209:16;11192:13;:33;:87;;11255:24;:22;:24::i;11192:87::-;-1:-1:-1;11228:24:0;;11108:179::o;43942:111::-;1008:12;:10;:12::i;:::-;43991:10:::1;:8;:10::i;:::-;44012:15;:13;:15::i;:::-;44038:7;:5;:7::i;:::-;43942:111::o:0;38329:221::-;38371:10;38385:9;38371:23;38368:58;;38403:21;;-1:-1:-1;;;38403:21:0;;;;;;;;;;;38368:58;38468:5;;38454:11;;:19;;-1:-1:-1;;;;;38468:5:0;;;;-1:-1:-1;;;38454:11:0;;;:19;:::i;:::-;-1:-1:-1;;;;;38439:34:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;38439:34:0;;38436:76;;;38482:28;;-1:-1:-1;;;38482:28:0;;;;;;;;;;;38436:76;38522:20;38531:10;38522:8;:20::i;43685:154::-;1008:12;:10;:12::i;:::-;43732:7:::1;:5;:7::i;:::-;43755:17;::::0;43761:10:::1;::::0;43755:17:::1;::::0;;;::::1;43799:5;::::0;-1:-1:-1;;;;;43799:5:0::1;43783:31;43815:15;:13;:15::i;:::-;43783:48;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;43783:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43685:154::o:0;47393:222::-;1008:12;:10;:12::i;:::-;47480:22:::1;::::0;::::1;::::0;::::1;::::0;:48:::1;;;47506:17;:22;;47527:1;47506:22;;47480:48;47477:84;;;47537:22;;-1:-1:-1::0;;;47537:22:0::1;;;;;;;;;;;47477:84;47571:16;:36:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;47571:36:0::1;-1:-1:-1::0;;47571:36:0;;::::1;::::0;;;::::1;::::0;;47393:222::o;46105:324::-;928:12;:10;:12::i;:::-;-1:-1:-1;;;;;46197:21:0;::::1;::::0;;:45:::1;;-1:-1:-1::0;;;;;;46222:20:0;::::1;::::0;46197:45:::1;46194:85;;;46251:26;;-1:-1:-1::0;;;46251:26:0::1;;;;;;;;;;;46194:85;46303:6;::::0;-1:-1:-1;;;;;46292:17:0;;::::1;46303:6:::0;::::1;46292:17;46289:40;;46311:6;:16:::0;;-1:-1:-1;;;;;;46311:16:0::1;-1:-1:-1::0;;;;;46311:16:0;::::1;;::::0;;46289:40:::1;46352:5;::::0;-1:-1:-1;;;;;46342:15:0;;::::1;46352:5:::0;::::1;46342:15;46339:36;;46359:5;:14:::0;;-1:-1:-1;;;;;;46359:14:0::1;-1:-1:-1::0;;;;;46359:14:0;::::1;;::::0;;46339:36:::1;46415:5;::::0;46407:6:::1;::::0;46390:31:::1;::::0;-1:-1:-1;;;;;46415:5:0;;::::1;::::0;46407:6;;::::1;::::0;46390:31:::1;::::0;46415:5:::1;::::0;46390:31:::1;46105:324:::0;;:::o;36337:881::-;36424:11;3737:19;:17;:19::i;:::-;36451:9:::1;-1:-1:-1::0;;;;;36451:21:0;::::1;;36448:65;;36481:30;;-1:-1:-1::0;;;36481:30:0::1;;;;;;;;;;;36448:65;-1:-1:-1::0;;;;;36526:25:0;::::1;;::::0;;;:15:::1;:25;::::0;;;;;-1:-1:-1;;;;;36526:25:0::1;:30:::0;36523:128:::1;;36605:5;::::0;-1:-1:-1;;;;;36577:25:0;::::1;36605:5;36577:25:::0;;;:15:::1;:25;::::0;;;;;:33:::1;::::0;-1:-1:-1;;;;;36605:5:0;;::::1;::::0;36577:25:::1;:33;:::i;:::-;-1:-1:-1::0;;;;;36562:48:0::1;:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;36562:48:0::1;;36559:91;;;36620:28;;-1:-1:-1::0;;;36620:28:0::1;;;;;;;;;;;36559:91;36673:25;::::0;-1:-1:-1;;;36673:25:0;;-1:-1:-1;;;;;2497:32:1;;;36673:25:0::1;::::0;::::1;2479:51:1::0;36673:5:0::1;:15;::::0;::::1;::::0;2452:18:1;;36673:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36664:6;:34;36661:70;;;36707:22;;-1:-1:-1::0;;;36707:22:0::1;;;;;;;;;;;36661:70;36750:23;36766:6;36750:15;:23::i;:::-;36741:32:::0;-1:-1:-1;36787:11:0;;;:26:::1;;-1:-1:-1::0;36802:11:0;;36787:26:::1;36784:65;;;36822:25;;-1:-1:-1::0;;;36822:25:0::1;;;;;;;;;;;36784:65;36889:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;36861:25:0;::::1;;::::0;;;:15:::1;:25;::::0;;;;;;;;:40;;-1:-1:-1;;36861:40:0::1;-1:-1:-1::0;;;;;36861:40:0;;;::::1;::::0;;;::::1;::::0;;;36917:43;;10252:25:1;;;10293:18;;;10286:34;;;36861:25:0;;;;36917:43:::1;::::0;10225:18:1;36917:43:0::1;;;;;;;36973:55;-1:-1:-1::0;;;;;36973:5:0::1;:22;36996:8:::0;37014:4:::1;37021:6:::0;36973:22:::1;:55::i;:::-;37100:23;37106:8;37116:6;37100:5;:23::i;:::-;37134:7;:5;:7::i;:::-;37157:16;::::0;-1:-1:-1;;;37157:16:0;::::1;;;:21:::0;37154:57:::1;;37181:28;37194:6;37202;37181:12;:28::i;45241:856::-:0;928:12;:10;:12::i;:::-;45458:2:::1;45443:12;-1:-1:-1::0;;;;;45443:17:0::1;;45440:53;;;45469:22;;-1:-1:-1::0;;;45469:22:0::1;;;;;;;;;;;45440:53;-1:-1:-1::0;;;;;45506:17:0;::::1;::::0;::::1;::::0;:38:::1;;;45527:12;-1:-1:-1::0;;;;;45527:17:0::1;45543:1;45527:17;;45506:38;45503:74;;;45553:22;;-1:-1:-1::0;;;45553:22:0::1;;;;;;;;;;;45503:74;45587:10;45638:13:::0;45623:12;45600:20:::1;45611:9:::0;45600:8;:20:::1;:::i;:::-;:35;;;;:::i;:::-;:51;;;;:::i;:::-;45587:64:::0;-1:-1:-1;34016:4:0::1;-1:-1:-1::0;;;;;45665:17:0;::::1;;45662:53;;;45691:22;;-1:-1:-1::0;;;45691:22:0::1;;;;;;;;;;;45662:53;-1:-1:-1::0;;;;;45728:24:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;45770:12:0::1;::::0;-1:-1:-1;;;;;45756:26:0;;::::1;45770:12:::0;::::1;45756:26;;45728:54;45725:86;;;45784:12;:25:::0;;-1:-1:-1;;;;;;45784:25:0::1;-1:-1:-1::0;;;;;45784:25:0;::::1;;::::0;;45725:86:::1;45837:12;45823:11;;:26;;;;;-1:-1:-1::0;;;;;45823:26:0::1;;;;;-1:-1:-1::0;;;;;45823:26:0::1;;;;;;45870:8;45860:7;;:18;;;;;-1:-1:-1::0;;;;;45860:18:0::1;;;;;-1:-1:-1::0;;;;;45860:18:0::1;;;;;;45900:9;45889:8;;:20;;;;;-1:-1:-1::0;;;;;45889:20:0::1;;;;;-1:-1:-1::0;;;;;45889:20:0::1;;;;;;45934:12;45920:11;;:26;;;;;-1:-1:-1::0;;;;;45920:26:0::1;;;;;-1:-1:-1::0;;;;;45920:26:0::1;;;;;;45971:12;45957:11;;:26;;;;;-1:-1:-1::0;;;;;45957:26:0::1;;;;;-1:-1:-1::0;;;;;45957:26:0::1;;;;;;46009:13;45994:12;;:28;;;;;-1:-1:-1::0;;;;;45994:28:0::1;;;;;-1:-1:-1::0;;;;;45994:28:0::1;;;;;;46076:12;;;;;;;;;-1:-1:-1::0;;;;;46076:12:0::1;-1:-1:-1::0;;;;;46038:51:0::1;46071:3;-1:-1:-1::0;;;;;46038:51:0::1;46058:11;;;;;;;;;-1:-1:-1::0;;;;;46058:11:0::1;-1:-1:-1::0;;;;;46038:51:0::1;;;;;;;;;;;45429:668;45241:856:::0;;;;;;;:::o;42758:147::-;42813:4;42837:11;;42852:1;42837:16;:60;;42886:11;;42863:13;:11;:13::i;:::-;:20;;42879:4;42863:20;:::i;:::-;:34;;;;:::i;42837:60::-;-1:-1:-1;42856:4:0;;42758:147::o;33426:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33426:29:0;;-1:-1:-1;33426:29:0;:::o;43847:87::-;1008:12;:10;:12::i;:::-;43892:8:::1;:6;:8::i;:::-;43911:15;:13;:15::i;37226:127::-:0;37278:42;;-1:-1:-1;;;37278:42:0;;37309:10;37278:42;;;2479:51:1;37269:76:0;;37292:4;;37278:30;;2452:18:1;;37278:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37322:10;37334;37269:8;:76::i;48177:755::-;1008:12;:10;:12::i;:::-;-1:-1:-1;;;;;48298:15:0;::::1;33019:42;48298:15;::::0;:33:::1;;-1:-1:-1::0;;;;;;48317:14:0;::::1;32929:42;48317:14;48298:33;:50;;;-1:-1:-1::0;;;;;;48335:13:0;::::1;33107:42;48335:13;48298:50;48295:97;;;48357:33;;-1:-1:-1::0;;;48357:33:0::1;;;;;;;;;;;48295:97;48402:8;48424:7;48435:1;48424:12:::0;48421:95:::1;;48445:38;::::0;-1:-1:-1;;;48445:38:0;;48477:4:::1;48445:38;::::0;::::1;2479:51:1::0;-1:-1:-1;;;;;48445:23:0;::::1;::::0;::::1;::::0;2452:18:1;;48445:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48439:44;;48421:95;;;-1:-1:-1::0;48507:7:0;48421:95:::1;48533:6;48528:113;48545:5;:12;48541:1;:16;48528:113;;;48575:10;48591:5;48597:1;48591:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;48575:25;;::::1;::::0;;::::1;::::0;;-1:-1:-1;48575:25:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;48575:25:0;;::::1;-1:-1:-1::0;;;;;;48575:25:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;48575:25:0::1;-1:-1:-1::0;;;;;;48575:25:0;;;;;;::::1;::::0;;;;::::1;::::0;;48625:3:::1;48528:113;;;-1:-1:-1::0;48658:21:0::1;::::0;48675:3;;-1:-1:-1;;;;;48658:21:0;::::1;::::0;::::1;::::0;;;::::1;48716:6;::::0;48690:36:::1;::::0;-1:-1:-1;;;;;48690:25:0;;::::1;::::0;48716:6:::1;;48690:25;:36::i;:::-;48763:6;::::0;48737:49:::1;::::0;-1:-1:-1;;;;;48737:25:0;;::::1;::::0;48763:6:::1;-1:-1:-1::0;;48737:25:0::1;:49::i;:::-;48814:6;::::0;-1:-1:-1;;;;;48814:6:0::1;48797:78;48876:3:::0;48814:6;48884:10:::1;48904:4;48911:12;:10;:12::i;:::-;48797:127;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48284:648;48177:755:::0;;;:::o;6698:20::-;;;;;;;:::i;41625:340::-;41668:4;41685:14;41702:15;:13;:15::i;:::-;41685:32;-1:-1:-1;41728:15:0;41758:14;;41754:124;;41822:6;;41805:61;;-1:-1:-1;;;41805:61:0;;;;;12591:25:1;;;33019:42:0;12670:18:1;;;12663:43;32929:42:0;12722:18:1;;;12715:43;-1:-1:-1;;;;;41822:6:0;;;;41805:37;;12564:18:1;;41805:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41789:77:0;-1:-1:-1;41754:124:0;41936:7;;34016:4;;-1:-1:-1;;;;;;;;41936:7:0;;;;;34016:4;;41895:24;;41908:11;41895:10;:24;:::i;:::-;:38;;;;:::i;:::-;:48;;;;:::i;:::-;:62;;;;:::i;:::-;41888:69;;;;41625:340;:::o;8373:385::-;8470:10;8443:4;8460:21;;;:9;:21;;;;;:31;;8485:6;;8460:21;8443:4;;8460:31;;8485:6;;8460:31;:::i;:::-;;;;-1:-1:-1;;;;;;;8642:13:0;;;;;;:9;:13;;;;;;;:23;;;;;;8694:32;8703:10;;-1:-1:-1;;;;;;;;;;;8694:32:0;;;8659:6;160:25:1;;148:2;133:18;;14:177;42550:129:0;42636:5;;42620:51;;-1:-1:-1;;;42620:51:0;;33019:42;42620:51;;;13292:34:1;42665:4:0;13342:18:1;;;13335:43;42596:4:0;;-1:-1:-1;;;;;42636:5:0;;42620:29;;13227:18:1;;42620:51:0;13080:304:1;37428:893:0;37518:11;37545:9;-1:-1:-1;;;;;37545:21:0;;;;;;:44;;-1:-1:-1;37570:9:0;-1:-1:-1;;;;;37570:19:0;;;;37545:44;37542:88;;;37598:30;;-1:-1:-1;;;37598:30:0;;;;;;;;;;;37542:88;37652:38;;-1:-1:-1;;;37652:38:0;;-1:-1:-1;;;;;2497:32:1;;37652:38:0;;;2479:51:1;37666:4:0;;37652:30;;2452:18:1;;37652:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37643:6;:47;37640:83;;;37699:22;;-1:-1:-1;;;37699:22:0;;;;;;;;;;;37640:83;37742:23;37758:6;37742:15;:23::i;:::-;37733:32;-1:-1:-1;37779:11:0;;;:26;;-1:-1:-1;37794:11:0;;37779:26;37776:65;;;37814:25;;-1:-1:-1;;;37814:25:0;;;;;;;;;;;37776:65;37853:21;37859:6;37867;37853:5;:21::i;:::-;37890:50;;;10252:25:1;;;10308:2;10293:18;;10286:34;;;-1:-1:-1;;;;;37890:50:0;;;;;;;;;;;;10225:18:1;37890:50:0;;;;;;;37951:16;37960:6;37951:8;:16::i;:::-;37996:30;;-1:-1:-1;;;37996:30:0;;38020:4;37996:30;;;2479:51:1;37980:13:0;;37996:5;-1:-1:-1;;;;;37996:15:0;;;;2452:18:1;;37996:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37980:46;;38052:6;38041:8;:17;38037:43;;;-1:-1:-1;38072:6:0;38037:43;38095:11;;-1:-1:-1;;;38095:11:0;;-1:-1:-1;;;;;38095:11:0;:16;38092:222;;38160:11;;38127:19;;34016:4;;38149:22;;-1:-1:-1;;;38160:11:0;;-1:-1:-1;;;;;38160:11:0;38149:8;:22;:::i;:::-;:36;;;;:::i;:::-;38127:58;-1:-1:-1;38200:55:0;38219:8;38229:25;38127:58;38229:8;:25;:::i;:::-;-1:-1:-1;;;;;38200:5:0;:18;;:55;:18;:55::i;:::-;38112:155;38092:222;;;38274:38;-1:-1:-1;;;;;38274:5:0;:18;38293:8;38303;38274:18;:38::i;:::-;37531:790;37428:893;;;;;:::o;47623:165::-;1008:12;:10;:12::i;:::-;47697:4:::1;47688:6;-1:-1:-1::0;;;;;47688:13:0::1;;:29;;;;47714:3;47705:6;-1:-1:-1::0;;;;;47705:12:0::1;;47688:29;47685:71;;;47727:27;;-1:-1:-1::0;;;47727:27:0::1;;;;;;;;;;;47685:71;47766:5;:14:::0;;-1:-1:-1;;47766:14:0::1;-1:-1:-1::0;;;;;47766:14:0;;;::::1;::::0;;;::::1;::::0;;47623:165::o;42913:260::-;43021:11;;42984:7;;43102:11;;:63;;43125:40;43143:6;43151:13;:11;:13::i;:::-;43125:6;;:40;:17;:40::i;1798:226::-;1890:10;;-1:-1:-1;;;;;1890:10:0;1876;:24;1873:53;;1909:15;;-1:-1:-1;;;1909:15:0;;;;;;;;;;;1873:53;1936:10;:27;;-1:-1:-1;;;;;;1936:27:0;-1:-1:-1;;;;;1936:27:0;;;;;;;;1979:37;;1993:10;;1979:37;;-1:-1:-1;;1979:37:0;1798:226;:::o;33905:43::-;;;;;;;;;;;;36151:98;36201:27;;-1:-1:-1;;;36201:27:0;;36217:10;36201:27;;;2479:51:1;36193:48:0;;36201:5;-1:-1:-1;;;;;36201:15:0;;;;2452:18:1;;36201:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36230:10;36193:7;:48::i;46437:590::-;1008:12;:10;:12::i;:::-;46580:18;;:23;46577:186:::1;;46624:6;46619:133;46636:11;:18;46632:1;:22;46619:133;;;46672:14;46692:11;46704:1;46692:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;46672:35;;::::1;::::0;;::::1;::::0;;-1:-1:-1;46672:35:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;46672:35:0;;::::1;-1:-1:-1::0;;;;;;46672:35:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;46672:35:0::1;-1:-1:-1::0;;;;;;46672:35:0;;;;;;::::1;::::0;;;;::::1;::::0;;46732:3:::1;46619:133;;;;46577:186;46776:19:::0;;:24;46773:190:::1;;46821:6;46816:136;46833:12;:19;46829:1;:23;46816:136;;;46870:15;46891:12;46904:1;46891:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;46870:37;;::::1;::::0;;::::1;::::0;;-1:-1:-1;46870:37:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;46870:37:0;;::::1;-1:-1:-1::0;;;;;;46870:37:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;46870:37:0::1;-1:-1:-1::0;;;;;;46870:37:0;;;;;;::::1;::::0;;;;::::1;::::0;;46932:3:::1;46816:136;;;;46773:190;47003:15;46978:41;;;;;;:::i;:::-;;;;;;;;46987:14;46978:41;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;46437:590:::0;;:::o;33851:47::-;;;;;;;;;;;;1625:165;928:12;:10;:12::i;:::-;1708:5:::1;:16:::0;;-1:-1:-1;;;;;;1708:16:0::1;-1:-1:-1::0;;;;;1708:16:0;::::1;::::0;;::::1;::::0;;;1740:42:::1;::::0;1761:10:::1;::::0;1740:42:::1;::::0;-1:-1:-1;;1740:42:0::1;1625:165:::0;:::o;41973:106::-;42041:30;;-1:-1:-1;;;42041:30:0;;42065:4;42041:30;;;2479:51:1;42017:4:0;;42041:5;-1:-1:-1;;;;;42041:15:0;;;;2452:18:1;;42041:30:0;2333:203:1;13576:541:0;13696:9;13948:1;-1:-1:-1;;13931:19:0;13928:1;13925:26;13922:1;13918:34;13911:42;13898:11;13894:60;13884:118;;13985:1;13982;13975:12;13884:118;-1:-1:-1;14076:9:0;;14072:27;;13576:541::o;2140:126::-;2207:5;;-1:-1:-1;;;;;2207:5:0;2193:10;:19;;;:47;;-1:-1:-1;2230:10:0;;-1:-1:-1;;;;;2230:10:0;2216;:24;;2193:47;2190:69;;;2249:8;;-1:-1:-1;;;2249:8:0;;;;;;;;;;;19346:1527;19462:12;19637:4;19631:11;-1:-1:-1;;;19763:17:0;19756:93;19897:2;19893:1;19874:17;19870:25;19863:37;19978:6;19973:2;19954:17;19950:26;19943:42;20790:2;20787:1;20783:2;20764:17;20761:1;20754:5;20747;20742:51;20306:16;20299:24;20293:2;20275:16;20272:24;20268:1;20264;20258:8;20255:15;20251:46;20248:76;20045:763;20034:774;;;20839:7;20831:34;;;;-1:-1:-1;;;20831:34:0;;14450:2:1;20831:34:0;;;14432:21:1;14489:2;14469:18;;;14462:30;-1:-1:-1;;;14508:18:1;;;14501:44;14562:18;;20831:34:0;;;;;;;;11295:457;11360:7;11461:95;11595:4;11579:22;;;;;;:::i;:::-;;;;;;;;;;11428:301;;;16002:25:1;;;;16043:18;;16036:34;;;;11624:14:0;16086:18:1;;;16079:34;11661:13:0;16129:18:1;;;16122:34;11705:4:0;16172:19:1;;;16165:61;15974:19;;11428:301:0;;;;;;;;;;;;11400:344;;;;;;11380:364;;11295:457;:::o;5087:114::-;3996:16;:14;:16::i;:::-;5146:7:::1;:11:::0;;-1:-1:-1;;;;5146:11:0::1;::::0;;5173:20:::1;::::0;5182:10:::1;2479:51:1::0;;5173:20:0::1;::::0;2467:2:1;2452:18;5173:20:0::1;;;;;;;;5087:114::o:0;49163:267::-;49226:5;;49208:40;;-1:-1:-1;;;;;49208:5:0;:17;;;49226:5;-1:-1:-1;;49208:17:0;:40::i;:::-;49284:6;;49259:48;;33019:42;;-1:-1:-1;;;;;49284:6:0;-1:-1:-1;;49259:24:0;:48::i;:::-;49342:6;;49318:47;;32929:42;;-1:-1:-1;;;;;49342:6:0;-1:-1:-1;;49318:23:0;:47::i;:::-;49399:6;;49376:46;;33107:42;;-1:-1:-1;;;;;49399:6:0;-1:-1:-1;;49376:22:0;:46::i;39179:142::-;39232:30;;-1:-1:-1;;;39232:30:0;;39256:4;39232:30;;;2479:51:1;39216:13:0;;39232:5;-1:-1:-1;;;;;39232:15:0;;;;2452:18:1;;39232:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39289:5;;39273:40;;-1:-1:-1;;;39273:40:0;;;;;160:25:1;;;39216:46:0;;-1:-1:-1;;;;;;39289:5:0;;39273:30;;133:18:1;;39273:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39205:116;39179:142::o;44102:195::-;44147:16;44178:14;44220:5;-1:-1:-1;;;;;44197:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44175:67;;;;44272:9;44284:4;44272:16;;;;:::i;:::-;44253:36;;44164:133;44102:195;:::o;38558:397::-;3737:19;:17;:19::i;:::-;38640:12:::1;:10;:12::i;:::-;38626:11;:26:::0;;-1:-1:-1;;;;;38626:26:0;;;::::1;-1:-1:-1::0;;;38626:26:0::1;-1:-1:-1::0;;;;38626:26:0;;::::1;::::0;;;::::1;::::0;;38668:15:::1;::::0;-1:-1:-1;;;;;38668:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;38668:15:0::1;38710:5;::::0;38694:61:::1;::::0;-1:-1:-1;;;38694:61:0;;-1:-1:-1;;;;;38710:5:0;;::::1;::::0;38694:32:::1;::::0;:61:::1;::::0;38735:4:::1;::::0;38742:12:::1;::::0;38694:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38783:37:0::1;::::0;-1:-1:-1;;;38783:37:0;;38814:4:::1;38783:37;::::0;::::1;2479:51:1::0;38766:14:0::1;::::0;-1:-1:-1;33019:42:0::1;::::0;-1:-1:-1;38783:22:0::1;::::0;2452:18:1;;38783:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38766:54:::0;-1:-1:-1;38837:14:0;;38833:97:::1;;38869:19;38881:6;38869:11;:19::i;:::-;38903:15;:13;:15::i;:::-;38940:7;:5;:7::i;:::-;38615:340;38558:397:::0;:::o;2032:98::-;2099:5;;-1:-1:-1;;;;;2099:5:0;2085:10;:19;2082:41;;2113:8;;-1:-1:-1;;;2113:8:0;;;;;;;;;;;4285:159;4197:7;;-1:-1:-1;;;4197:7:0;;;;4405:13;4402:35;;4427:8;;-1:-1:-1;;;4427:8:0;;;;;;;;;;;16153:1648;16297:12;16472:4;16466:11;-1:-1:-1;;;16598:17:0;16591:93;16732:4;16728:1;16709:17;16705:25;16698:39;16817:2;16812;16793:17;16789:26;16782:38;16898:6;16893:2;16874:17;16870:26;16863:42;17712:2;17709:1;17704:3;17685:17;17682:1;17675:5;17668;17663:52;17226:16;17219:24;17213:2;17195:16;17192:24;17188:1;17184;17178:8;17175:15;17171:46;17168:76;16965:765;16954:776;;;17761:7;17753:40;;;;-1:-1:-1;;;17753:40:0;;17537:2:1;17753:40:0;;;17519:21:1;17576:2;17556:18;;;17549:30;-1:-1:-1;;;17595:18:1;;;17588:50;17655:18;;17753:40:0;17335:344:1;11952:335:0;12038:6;12023:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;12195:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;12247:32;160:25:1;;;-1:-1:-1;;;;;;;;;;;12247:32:0;133:18:1;12247:32:0;;;;;;;;11952:335;;:::o;49531:104::-;49608:19;49617:9;49608:8;:19::i;4830:116::-;3737:19;:17;:19::i;:::-;4890:7:::1;:11:::0;;-1:-1:-1;;;;4890:11:0::1;-1:-1:-1::0;;;4890:11:0::1;::::0;;4917:21:::1;::::0;4927:10:::1;2479:51:1::0;;4917:21:0::1;::::0;2467:2:1;2452:18;4917:21:0::1;2333:203:1::0;48940:215:0;49003:5;;48985:27;;-1:-1:-1;;;;;48985:5:0;:17;;;49003:5;;48985:17;:27::i;:::-;49048:6;;49023:35;;33019:42;;-1:-1:-1;;;;;49048:6:0;;49023:24;:35::i;:::-;49093:6;;49069:34;;32929:42;;-1:-1:-1;;;;;49093:6:0;;49069:23;:34::i;:::-;49137:6;;49114:33;;33107:42;;-1:-1:-1;;;;;49137:6:0;;49114:22;:33::i;12295:338::-;-1:-1:-1;;;;;12368:15:0;;;;;;:9;:15;;;;;:25;;12387:6;;12368:15;:25;;12387:6;;12368:25;:::i;:::-;;;;-1:-1:-1;;12541:11:0;:21;;;;;;;12591:34;;160:25:1;;;-1:-1:-1;;;;;;;12591:34:0;;;-1:-1:-1;;;;;;;;;;;12591:34:0;148:2:1;133:18;12591:34:0;14:177:1;39367:218:0;39435:30;;-1:-1:-1;;;39435:30:0;;39459:4;39435:30;;;2479:51:1;39419:13:0;;39435:5;-1:-1:-1;;;;;39435:15:0;;;;2452:18:1;;39435:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39419:46;;39491:7;39480:8;:18;39476:102;;;39531:5;;-1:-1:-1;;;;;39531:5:0;39515:31;39547:18;39557:8;39547:7;:18;:::i;:::-;39515:51;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;39515:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39408:177;39367:218;:::o;17809:1529::-;17926:12;18101:4;18095:11;-1:-1:-1;;;18227:17:0;18220:93;18361:2;18357:1;18338:17;18334:25;18327:37;18442:6;18437:2;18418:17;18414:26;18407:42;19254:2;19251:1;19247:2;19228:17;19225:1;19218:5;19211;19206:51;18770:16;18763:24;18757:2;18739:16;18736:24;18732:1;18728;18722:8;18719:15;18715:46;18712:76;18509:763;18498:774;;;19303:7;19295:35;;;;-1:-1:-1;;;19295:35:0;;17886:2:1;19295:35:0;;;17868:21:1;17925:2;17905:18;;;17898:30;-1:-1:-1;;;17944:18:1;;;17937:45;17999:18;;19295:35:0;17684:339:1;4521:165:0;4197:7;;-1:-1:-1;;;4197:7:0;;;;4642:13;;4654:1;4642:13;4639:38;;4664:11;;-1:-1:-1;;;4664:11:0;;;;;;;;;;;39593:1102;39703:11;;39663:37;;-1:-1:-1;;;39663:37:0;;39694:4;39663:37;;;2479:51:1;39650:10:0;;34016:4;;-1:-1:-1;;;;;39703:11:0;;;;33019:42;;39663:22;;2452:18:1;;39663:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;:65;;;;:::i;:::-;39755:37;;-1:-1:-1;;;39755:37:0;;39786:4;39755:37;;;2479:51:1;39650:78:0;;-1:-1:-1;39739:13:0;;39650:78;;33019:42;;39755:22;;2452:18:1;;39755:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;;:::i;:::-;39850:6;;39833:60;;-1:-1:-1;;;39833:60:0;;;;;12591:25:1;;;33019:42:0;12670:18:1;;;12663:43;33198:42:0;12722:18:1;;;12715:43;39739:61:0;;-1:-1:-1;39814:14:0;;-1:-1:-1;;;;;39850:6:0;;;;39833:37;;12564:18:1;;39833:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39813:80:0;-1:-1:-1;39939:16:0;39951:4;39813:80;39939:16;:::i;:::-;39918:11;;:38;;;-1:-1:-1;;;39918:11:0;;-1:-1:-1;;;;;39918:11:0;:38;:::i;:::-;39904:11;:52;;-1:-1:-1;;;;;39904:52:0;-1:-1:-1;;;;;;;;39904:52:0;;;;;;;;;39986:6;;40042:8;;-1:-1:-1;;;;;39986:6:0;;;;39969:55;;40025:5;;-1:-1:-1;;33019:42:0;;40042:8;;;-1:-1:-1;;40067:4:0;;40074:16;;-1:-1:-1;;;40074:11:0;;;;40088:2;40074:16;:::i;:::-;39969:122;;-1:-1:-1;;;;;;39969:122:0;;;;;;;;;;18344:25:1;;;;18385:18;;;18378:34;;;;-1:-1:-1;;;;;18486:15:1;;;18466:18;;;18459:43;18538:15;;;18518:18;;;18511:43;18598:14;18591:22;18570:19;;;18563:51;18651:15;18630:19;;;18623:44;-1:-1:-1;;;;;18704:31:1;18683:19;;;18676:60;18316:19;;39969:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39969:122:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40124:8:0;;40118:40;;-1:-1:-1;;;40118:40:0;;40152:4;40118:40;;;2479:51:1;40104:11:0;;-1:-1:-1;;;;;40124:8:0;;40118:25;;2452:18:1;;40118:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40195:7;;40104:54;;-1:-1:-1;40171:12:0;;34016:4;;40186:16;;-1:-1:-1;;;40195:7:0;;-1:-1:-1;;;;;40195:7:0;40104:54;40186:16;:::i;:::-;:30;;;;:::i;:::-;40233:8;;40227:41;;-1:-1:-1;;;40227:41:0;;-1:-1:-1;;;;;19831:32:1;;;40227:41:0;;;19813:51:1;19880:18;;;19873:34;;;40171:45:0;;-1:-1:-1;40233:8:0;;;40227:24;;19786:18:1;;40227:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40284:12:0;;-1:-1:-1;;;40284:12:0;;-1:-1:-1;;;;;40284:12:0;:17;40281:166;;40342:12;;40313:17;;34016:4;;40333:21;;-1:-1:-1;;;40342:12:0;;-1:-1:-1;;;;;40342:12:0;40333:6;:21;:::i;:::-;:35;;;;:::i;:::-;40408:12;;40385:8;;40313:55;;-1:-1:-1;40379:56:0;;-1:-1:-1;;;;;40385:8:0;;;;40408:12;40313:55;40379:28;:56::i;:::-;40302:145;40281:166;40487:11;;40459:16;;34016:4;;40478:20;;-1:-1:-1;;;40487:11:0;;-1:-1:-1;;;;;40487:11:0;40478:6;:20;:::i;:::-;:34;;;;:::i;:::-;40529:8;;40523:47;;-1:-1:-1;;;40523:47:0;;33696:42;40523:47;;;19813:51:1;19880:18;;;19873:34;;;40459:53:0;;-1:-1:-1;;;;;;40529:8:0;;40523:24;;19786:18:1;;40523:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40608:8:0;;40583:13;;34016:4;;40599:17;;-1:-1:-1;;;;;40608:8:0;40599:6;:17;:::i;:::-;:31;;;;:::i;:::-;40647:8;;40666:10;;40641:46;;-1:-1:-1;;;40641:46:0;;-1:-1:-1;;;;;40666:10:0;;;40641:46;;;19813:51:1;19880:18;;;19873:34;;;40583:47:0;;-1:-1:-1;40647:8:0;;40641:24;;19786:18:1;;40641:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39639:1056;;;;;;;39593:1102;:::o;40703:657::-;40765:37;;-1:-1:-1;;;40765:37:0;;40796:4;40765:37;;;2479:51:1;40748:14:0;;40806:1;;33019:42;;40765:22;;2452:18:1;;40765:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;40748:59;;40819:12;40833;40849:19;40858:9;40849:8;:19::i;:::-;40896:6;;40981:11;;40879:114;;-1:-1:-1;;;40879:114:0;;40818:50;;-1:-1:-1;40818:50:0;;-1:-1:-1;;;;;;40896:6:0;;40879:49;;:114;;40929:9;;40818:50;;40949:15;;40974:4;;-1:-1:-1;;;40981:11:0;;;-1:-1:-1;;;;;40981:11:0;;40879:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40879:114:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41021:6:0;;41105:11;;41004:113;;-1:-1:-1;;;41004:113:0;;-1:-1:-1;;;;;41021:6:0;;;;41004:49;;:113;;41054:9;;41065:7;;41074:14;;41098:4;;-1:-1:-1;;;41105:11:0;;;-1:-1:-1;;;;;41105:11:0;;41004:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41004:113:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41143:36:0;;-1:-1:-1;;;41143:36:0;;41173:4;41143:36;;;2479:51:1;41130:10:0;;32929:42;;41143:21;;2452:18:1;;41143:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41203:35;;-1:-1:-1;;;41203:35:0;;41232:4;41203:35;;;2479:51:1;41130:49:0;;-1:-1:-1;41190:10:0;;33107:42;;41203:20;;2452:18:1;;41203:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41266:6;;41340:11;;41249:103;;-1:-1:-1;;;41249:103:0;;32929:42;41249:103;;;21243:34:1;33107:42:0;21293:18:1;;;21286:43;41266:6:0;21345:18:1;;;21338:50;21404:18;;;21397:34;;;21447:19;;;21440:35;;;41266:6:0;21491:19:1;;;21484:35;;;21535:19;;;21528:35;41333:4:0;21579:19:1;;;21572:44;-1:-1:-1;;;41340:11:0;;;-1:-1:-1;;;;;41340:11:0;21632:19:1;;;21625:60;41190:48:0;;-1:-1:-1;;;;;;41266:6:0;;41249:37;;21177:19:1;;41249:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44344:707::-;44474:11;:14;44497;:17;44459:71;;-1:-1:-1;;;44459:71:0;;-1:-1:-1;;;;;44497:17:0;;;44459:71;;;21943:51:1;22010:18;;;22003:34;;;44525:1:0;22053:18:1;;;22046:34;44528:1:0;22096:18:1;;;22089:34;44398:12:0;;;;;;44474:14;;;44459:37;;21915:19:1;;44459:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44459:71:0;;;;;;;;;;;;:::i;:::-;44436:94;;44547:6;44543:116;44559:6;:13;44555:1;:17;44543:116;;;44609:6;44616:1;44609:9;;;;;;;;:::i;:::-;;;;;;;44599:7;:19;;;;:::i;:::-;44589:29;-1:-1:-1;44643:3:0;;44543:116;;;-1:-1:-1;44680:12:0;44690:2;44680:7;:12;:::i;:::-;44744:14;;44767:17;;44729:71;;-1:-1:-1;;;44729:71:0;;-1:-1:-1;;;;;44767:17:0;;;44729:71;;;21943:51:1;22010:18;;;22003:34;;;44795:1:0;22053:18:1;;;22046:34;44798:1:0;22096:18:1;;;22089:34;44669:24:0;;-1:-1:-1;44706:20:0;;44744:14;;;44729:37;;21915:19:1;;44729:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44729:71:0;;;;;;;;;;;;:::i;:::-;44706:94;-1:-1:-1;44847:3:0;44832:11;:7;44842:1;44832:11;:::i;:::-;44822:21;;:7;:21;:::i;:::-;44821:29;;;;:::i;:::-;44811:39;;44867:6;44863:116;44879:6;:13;44875:1;:17;44863:116;;;44929:6;44936:1;44929:9;;;;;;;;:::i;:::-;;;;;;;44919:7;:19;;;;:::i;:::-;44909:29;-1:-1:-1;44963:3:0;;44863:116;;;-1:-1:-1;45040:3:0;45018:12;45028:2;45018:7;:12;:::i;:::-;45017:18;;45034:1;45017:18;:::i;:::-;45016:27;;;;:::i;:::-;45000:12;45010:2;45000:7;:12;:::i;:::-;44999:44;;;;:::i;:::-;44989:54;;44425:626;;44344:707;;;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:180::-;808:6;861:2;849:9;840:7;836:23;832:32;829:52;;;877:1;874;867:12;829:52;-1:-1:-1;900:23:1;;749:180;-1:-1:-1;749:180:1:o;934:173::-;1002:20;;-1:-1:-1;;;;;1051:31:1;;1041:42;;1031:70;;1097:1;1094;1087:12;1031:70;934:173;;;:::o;1112:254::-;1180:6;1188;1241:2;1229:9;1220:7;1216:23;1212:32;1209:52;;;1257:1;1254;1247:12;1209:52;1280:29;1299:9;1280:29;:::i;:::-;1270:39;1356:2;1341:18;;;;1328:32;;-1:-1:-1;;;1112:254:1:o;1563:186::-;1622:6;1675:2;1663:9;1654:7;1650:23;1646:32;1643:52;;;1691:1;1688;1681:12;1643:52;1714:29;1733:9;1714:29;:::i;2541:328::-;2618:6;2626;2634;2687:2;2675:9;2666:7;2662:23;2658:32;2655:52;;;2703:1;2700;2693:12;2655:52;2726:29;2745:9;2726:29;:::i;:::-;2716:39;;2774:38;2808:2;2797:9;2793:18;2774:38;:::i;:::-;2764:48;;2859:2;2848:9;2844:18;2831:32;2821:42;;2541:328;;;;;:::o;3482:269::-;3539:6;3592:2;3580:9;3571:7;3567:23;3563:32;3560:52;;;3608:1;3605;3598:12;3560:52;3647:9;3634:23;3697:4;3690:5;3686:16;3679:5;3676:27;3666:55;;3717:1;3714;3707:12;3756:260;3824:6;3832;3885:2;3873:9;3864:7;3860:23;3856:32;3853:52;;;3901:1;3898;3891:12;3853:52;3924:29;3943:9;3924:29;:::i;:::-;3914:39;;3972:38;4006:2;3995:9;3991:18;3972:38;:::i;:::-;3962:48;;3756:260;;;;;:::o;4021:254::-;4089:6;4097;4150:2;4138:9;4129:7;4125:23;4121:32;4118:52;;;4166:1;4163;4156:12;4118:52;4202:9;4189:23;4179:33;;4231:38;4265:2;4254:9;4250:18;4231:38;:::i;4280:171::-;4347:20;;-1:-1:-1;;;;;4396:30:1;;4386:41;;4376:69;;4441:1;4438;4431:12;4456:622;4563:6;4571;4579;4587;4595;4603;4611;4664:3;4652:9;4643:7;4639:23;4635:33;4632:53;;;4681:1;4678;4671:12;4632:53;4704:28;4722:9;4704:28;:::i;:::-;4694:38;;4751:37;4784:2;4773:9;4769:18;4751:37;:::i;:::-;4741:47;;4807:37;4840:2;4829:9;4825:18;4807:37;:::i;:::-;4797:47;;4863:37;4896:2;4885:9;4881:18;4863:37;:::i;:::-;4853:47;;4919:38;4952:3;4941:9;4937:19;4919:38;:::i;:::-;4909:48;;4976:38;5009:3;4998:9;4994:19;4976:38;:::i;:::-;4966:48;;5033:39;5067:3;5056:9;5052:19;5033:39;:::i;:::-;5023:49;;4456:622;;;;;;;;;;:::o;5083:127::-;5144:10;5139:3;5135:20;5132:1;5125:31;5175:4;5172:1;5165:15;5199:4;5196:1;5189:15;5215:253;5287:2;5281:9;5329:4;5317:17;;-1:-1:-1;;;;;5349:34:1;;5385:22;;;5346:62;5343:88;;;5411:18;;:::i;:::-;5447:2;5440:22;5215:253;:::o;5473:275::-;5544:2;5538:9;5609:2;5590:13;;-1:-1:-1;;5586:27:1;5574:40;;-1:-1:-1;;;;;5629:34:1;;5665:22;;;5626:62;5623:88;;;5691:18;;:::i;:::-;5727:2;5720:22;5473:275;;-1:-1:-1;5473:275:1:o;5753:189::-;5819:4;-1:-1:-1;;;;;5844:6:1;5841:30;5838:56;;;5874:18;;:::i;:::-;-1:-1:-1;5919:1:1;5915:14;5931:4;5911:25;;5753:189::o;5947:118::-;6033:5;6026:13;6019:21;6012:5;6009:32;5999:60;;6055:1;6052;6045:12;6070:1145;6130:5;6183:3;6176:4;6168:6;6164:17;6160:27;6150:55;;6201:1;6198;6191:12;6150:55;6237:6;6224:20;6263:4;6287:66;6303:49;6349:2;6303:49;:::i;:::-;6287:66;:::i;:::-;6387:15;;;6449:4;6492:11;;;6480:24;;6476:33;;;6418:12;;;;6375:3;6521:15;;;6518:35;;;6549:1;6546;6539:12;6518:35;6585:2;6577:6;6573:15;6597:589;6613:6;6608:3;6605:15;6597:589;;;6689:2;6683:3;6678;6674:13;6670:22;6667:112;;;6733:1;6762:2;6758;6751:14;6667:112;6805:22;;:::i;:::-;6854:23;6873:3;6854:23;:::i;:::-;6847:5;6840:38;6914:32;6942:2;6937:3;6933:12;6914:32;:::i;:::-;6909:2;6902:5;6898:14;6891:56;6970:2;7022;7017:3;7013:12;7000:26;7039:30;7061:7;7039:30;:::i;:::-;7089:14;;;7082:31;7126:18;;7164:12;;;;6630;;6597:589;;;-1:-1:-1;7204:5:1;;6070:1145;-1:-1:-1;;;;;;;6070:1145:1:o;7220:519::-;7345:6;7353;7361;7414:2;7402:9;7393:7;7389:23;7385:32;7382:52;;;7430:1;7427;7420:12;7382:52;7453:29;7472:9;7453:29;:::i;:::-;7443:39;;7529:2;7518:9;7514:18;7501:32;7491:42;;7584:2;7573:9;7569:18;7556:32;-1:-1:-1;;;;;7603:6:1;7600:30;7597:50;;;7643:1;7640;7633:12;7597:50;7666:67;7725:7;7716:6;7705:9;7701:22;7666:67;:::i;:::-;7656:77;;;7220:519;;;;;:::o;7744:328::-;7821:6;7829;7837;7890:2;7878:9;7869:7;7865:23;7861:32;7858:52;;;7906:1;7903;7896:12;7858:52;7942:9;7929:23;7919:33;;7971:38;8005:2;7994:9;7990:18;7971:38;:::i;:::-;7961:48;;8028:38;8062:2;8051:9;8047:18;8028:38;:::i;:::-;8018:48;;7744:328;;;;;:::o;8077:184::-;8135:6;8188:2;8176:9;8167:7;8163:23;8159:32;8156:52;;;8204:1;8201;8194:12;8156:52;8227:28;8245:9;8227:28;:::i;8266:653::-;8430:6;8438;8491:2;8479:9;8470:7;8466:23;8462:32;8459:52;;;8507:1;8504;8497:12;8459:52;8547:9;8534:23;-1:-1:-1;;;;;8617:2:1;8609:6;8606:14;8603:34;;;8633:1;8630;8623:12;8603:34;8656:67;8715:7;8706:6;8695:9;8691:22;8656:67;:::i;:::-;8646:77;;8776:2;8765:9;8761:18;8748:32;8732:48;;8805:2;8795:8;8792:16;8789:36;;;8821:1;8818;8811:12;8789:36;;8844:69;8905:7;8894:8;8883:9;8879:24;8844:69;:::i;:::-;8834:79;;;8266:653;;;;;:::o;8924:184::-;8994:6;9047:2;9035:9;9026:7;9022:23;9018:32;9015:52;;;9063:1;9060;9053:12;9015:52;-1:-1:-1;9086:16:1;;8924:184;-1:-1:-1;8924:184:1:o;9113:127::-;9174:10;9169:3;9165:20;9162:1;9155:31;9205:4;9202:1;9195:15;9229:4;9226:1;9219:15;9245:125;9310:9;;;9331:10;;;9328:36;;;9344:18;;:::i;9375:380::-;9454:1;9450:12;;;;9497;;;9518:61;;9572:4;9564:6;9560:17;9550:27;;9518:61;9625:2;9617:6;9614:14;9594:18;9591:38;9588:161;;9671:10;9666:3;9662:20;9659:1;9652:31;9706:4;9703:1;9696:15;9734:4;9731:1;9724:15;9588:161;;9375:380;;;:::o;9760:128::-;9827:9;;;9848:11;;;9845:37;;;9862:18;;:::i;9893:180::-;-1:-1:-1;;;;;9998:10:1;;;10010;;;9994:27;;10033:11;;;10030:37;;;10047:18;;:::i;:::-;10030:37;9893:180;;;;:::o;10331:168::-;10404:9;;;10435;;10452:15;;;10446:22;;10432:37;10422:71;;10473:18;;:::i;10504:217::-;10544:1;10570;10560:132;;10614:10;10609:3;10605:20;10602:1;10595:31;10649:4;10646:1;10639:15;10677:4;10674:1;10667:15;10560:132;-1:-1:-1;10706:9:1;;10504:217::o;10726:127::-;10787:10;10782:3;10778:20;10775:1;10768:31;10818:4;10815:1;10808:15;10842:4;10839:1;10832:15;11001:718;11068:3;11106:5;11100:12;11133:6;11128:3;11121:19;11159:4;11188:2;11183:3;11179:12;11172:19;;11210:5;11207:1;11200:16;11252:2;11249:1;11239:16;11273:1;11283:411;11297:6;11294:1;11291:13;11283:411;;;11404:13;;-1:-1:-1;;;;;11400:22:1;;;11388:35;;11373:1;11459:14;;;11453:21;11508:18;;;11494:12;;;11487:40;11364:3;11581:19;;;;11602:4;11577:30;11570:38;11563:46;11556:4;11547:14;;11540:70;11639:4;11630:14;;;;11679:4;11667:17;;;;11312:9;11283:411;;;-1:-1:-1;11710:3:1;;11001:718;-1:-1:-1;;;;;11001:718:1:o;11724:660::-;12062:6;12051:9;12044:25;12105:6;12100:2;12089:9;12085:18;12078:34;12148:3;12143:2;12132:9;12128:18;12121:31;12025:4;12169:71;12235:3;12224:9;12220:19;12212:6;12169:71;:::i;:::-;-1:-1:-1;;;;;12276:32:1;;;;12271:2;12256:18;;12249:60;-1:-1:-1;;;;;;12346:31:1;;;;12340:3;12325:19;;;12318:60;12161:79;11724:660;-1:-1:-1;;;11724:660:1:o;12769:306::-;12845:6;12853;12906:2;12894:9;12885:7;12881:23;12877:32;12874:52;;;12922:1;12919;12912:12;12874:52;12951:9;12945:16;12935:26;;13004:2;12993:9;12989:18;12983:25;13017:28;13039:5;13017:28;:::i;:::-;13064:5;13054:15;;;12769:306;;;;;:::o;13389:854::-;13590:3;13621;13653:6;13647:13;13678:3;13669:12;;13700:6;13697:1;13690:17;13726:4;13766:2;13763:1;13753:16;13787:1;13797:419;13811:6;13808:1;13805:13;13797:419;;;13920:13;;-1:-1:-1;;;;;13916:22:1;;;13902:37;;13887:1;13975:14;;;13969:21;14026:18;;;14010:14;;;14003:42;13878:3;14099:19;;;;14120:4;14095:30;14088:38;14081:46;14076:2;14065:14;;14058:70;14161:4;14150:16;;;;14201:4;14189:17;;;;13826:9;13797:419;;;-1:-1:-1;14232:5:1;;13389:854;-1:-1:-1;;;;;;13389:854:1:o;14591:1147::-;14721:3;14750:1;14783:6;14777:13;14813:3;14835:1;14863:9;14859:2;14855:18;14845:28;;14923:2;14912:9;14908:18;14945;14935:61;;14989:4;14981:6;14977:17;14967:27;;14935:61;15015:2;15063;15055:6;15052:14;15032:18;15029:38;15026:165;;-1:-1:-1;;;15090:33:1;;15146:4;15143:1;15136:15;15176:4;15097:3;15164:17;15026:165;15207:18;15234:133;;;;15381:1;15376:337;;;;15200:513;;15234:133;-1:-1:-1;;15267:24:1;;15255:37;;15340:14;;15333:22;15321:35;;15312:45;;;-1:-1:-1;15234:133:1;;15376:337;10948:1;10941:14;;;10985:4;10972:18;;15488:1;15502:165;15516:6;15513:1;15510:13;15502:165;;;15594:14;;15581:11;;;15574:35;15637:16;;;;15531:10;;15502:165;;;15506:3;;15696:6;15691:3;15687:16;15680:23;;15200:513;-1:-1:-1;15729:3:1;;14591:1147;-1:-1:-1;;;;;;;;14591:1147:1:o;16237:306::-;16325:6;16333;16341;16394:2;16382:9;16373:7;16369:23;16365:32;16362:52;;;16410:1;16407;16400:12;16362:52;16439:9;16433:16;16423:26;;16489:2;16478:9;16474:18;16468:25;16458:35;;16533:2;16522:9;16518:18;16512:25;16502:35;;16237:306;;;;;:::o;16548:782::-;16715:4;16763:2;16752:9;16748:18;16802:1;16798;16793:3;16789:11;16785:19;16843:2;16835:6;16831:15;16820:9;16813:34;16866:2;16904;16899;16888:9;16884:18;16877:30;16927:6;16962;16956:13;16993:6;16985;16978:22;17031:2;17020:9;17016:18;17009:25;;17053:6;17050:1;17043:17;17096:2;17093:1;17083:16;17069:30;;17117:1;17127:177;17141:6;17138:1;17135:13;17127:177;;;17206:13;;17202:22;;17190:35;;17292:1;17280:14;;;;17245:12;;;;17156:9;17127:177;;;-1:-1:-1;17321:3:1;;16548:782;-1:-1:-1;;;;;;;;16548:782:1:o;18747:887::-;18842:6;18873:2;18916;18904:9;18895:7;18891:23;18887:32;18884:52;;;18932:1;18929;18922:12;18884:52;18965:9;18959:16;-1:-1:-1;;;;;18990:6:1;18987:30;18984:50;;;19030:1;19027;19020:12;18984:50;19053:22;;19106:4;19098:13;;19094:27;-1:-1:-1;19084:55:1;;19135:1;19132;19125:12;19084:55;19164:2;19158:9;19187:66;19203:49;19249:2;19203:49;:::i;19187:66::-;19287:15;;;19369:1;19365:10;;;;19357:19;;19353:28;;;19318:12;;;;19393:19;;;19390:39;;;19425:1;19422;19415:12;19390:39;19449:11;;;;19469:135;19485:6;19480:3;19477:15;19469:135;;;19551:10;;19539:23;;19502:12;;;;19582;;;;19469:135;;;19623:5;18747:887;-1:-1:-1;;;;;;;18747:887:1:o;19918:245::-;19985:6;20038:2;20026:9;20017:7;20013:23;20009:32;20006:52;;;20054:1;20051;20044:12;20006:52;20086:9;20080:16;20105:28;20127:5;20105:28;:::i

Swarm Source

ipfs://7909f9013660b9bcf0f3e6cfb23314b98fd3d636e9b45aee7765ffa6d98158e5
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.