ETH Price: $3,240.36 (+2.18%)
Gas: 7 Gwei

Token

vAPE (vAPE)
 

Overview

Max Total Supply

159,976.407073514515553194 vAPE

Holders

270

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
clicksell.eth
Balance
7.173120887425644473 vAPE

Value
$0.00
0xd694b5db4d1bff216e2fe3b3b72cf2f5ce95c56b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
vApe

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-27
*/

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/token/ERC20/[email protected]
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/lib/Operator.sol



pragma solidity 0.8.1;
contract Operator is Context, Ownable {
    address private _operator;

    event OperatorTransferred(address indexed previousOperator, address indexed newOperator);

    constructor() {
        _operator = _msgSender();
        emit OperatorTransferred(address(0), _operator);
    }

    function operator() public view returns (address) {
        return _operator;
    }

    modifier onlyOperator() {
        require(_operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    function isOperator() public view returns (bool) {
        return _msgSender() == _operator;
    }

    function transferOperator(address newOperator_) public onlyOwner {
        _transferOperator(newOperator_);
    }

    function _transferOperator(address newOperator_) internal {
        require(newOperator_ != address(0), "operator: zero address given for new operator");
        emit OperatorTransferred(address(0), newOperator_);
        _operator = newOperator_;
    }
}


// File contracts/interfaces/IOracle.sol


pragma solidity 0.8.1;

interface IOracle {
    function update() external;

    function consult(address _token, uint256 _amountIn) external view returns (uint144 amountOut);

    function twap(address _token, uint256 _amountIn) external view returns (uint144 _amountOut);
}


// File contracts/tokens/vAPE.sol


pragma solidity 0.8.1;
contract vApe is ERC20Burnable, Operator {
    using SafeMath for uint8;
    using SafeMath for uint256;

    // Initial distribution for the first 3 day genesis pools
    uint256 public constant INITIAL_GENESIS_POOL_DISTRIBUTION = 11000 ether;
    // Initial distribution for the vApe LP reward pools
    uint256 public constant INITIAL_VAPE_POOL_DISTRIBUTION = 140000 ether;
    // Distribution for airdrops wallet
    uint256 public constant INITIAL_AIRDROP_WALLET_DISTRIBUTION = 9000 ether;

    // Have the rewards been distributed to the pools
    bool public rewardPoolDistributed = false;

    /* ================= Taxation =============== */
    /* ================= NOT IN USE ============= */
    // Address of the Oracle
    address public vapeOracle;
    // Address of the Tax Office
    address public taxOffice;

    // Current tax rate
    uint256 public taxRate;
    // Price threshold below which taxes will get burned
    uint256 public burnThreshold = 1.10e18;
    // Address of the tax collector wallet
    address public taxCollectorAddress;

    // Should the taxes be calculated using the tax tiers
    bool public autoCalculateTax;

    // Tax Tiers
    uint256[] public taxTiersTwaps = [0, 5e17, 6e17, 7e17, 8e17, 9e17, 9.5e17, 1e18, 1.05e18, 1.10e18, 1.20e18, 1.30e18, 1.40e18, 1.50e18];
    uint256[] public taxTiersRates = [2000, 1900, 1800, 1700, 1600, 1500, 1500, 1500, 1500, 1400, 900, 400, 200, 100];

    // Sender addresses excluded from Tax
    mapping(address => bool) public excludedAddresses;

    event TaxOfficeTransferred(address oldAddress, address newAddress);

    modifier onlyTaxOffice() {
        require(taxOffice == msg.sender, "Caller is not the tax office");
        _;
    }

    modifier onlyOperatorOrTaxOffice() {
        require(isOperator() || taxOffice == msg.sender, "Caller is not the operator or the tax office");
        _;
    }
    /* ================= NOT IN USE ============= */
    /* ================= End Taxation =============== */

    /**
     * @notice Constructs the Ape ERC-20 contract.
     */
    constructor() ERC20("vAPE", "vAPE") {
        // Mints 2 vApe to contract creator for initial LP setup
        excludeAddress(address(this));
        _mint(msg.sender, 2 ether);
        taxRate = 0;
        taxCollectorAddress = msg.sender;
    }

    /* ============= Taxation ============= */
    /* ============= NOT IN USE =========== */

    function getTaxTiersTwapsCount() public view returns (uint256 count) {
        return taxTiersTwaps.length;
    }

    function getTaxTiersRatesCount() public view returns (uint256 count) {
        return taxTiersRates.length;
    }

    function isAddressExcluded(address _address) public view returns (bool) {
        return excludedAddresses[_address];
    }

    function setTaxTiersTwap(uint8 _index, uint256 _value) public onlyTaxOffice returns (bool) {
        require(_index >= 0, "Index has to be higher than 0");
        require(_index < getTaxTiersTwapsCount(), "Index has to lower than count of tax tiers");
        if (_index > 0) {
            require(_value > taxTiersTwaps[_index - 1]);
        }
        if (_index < getTaxTiersTwapsCount().sub(1)) {
            require(_value < taxTiersTwaps[_index + 1]);
        }
        taxTiersTwaps[_index] = _value;
        return true;
    }

    function setTaxTiersRate(uint8 _index, uint256 _value) public onlyTaxOffice returns (bool) {
        require(_index >= 0, "Index has to be higher than 0");
        require(_index < getTaxTiersRatesCount(), "Index has to lower than count of tax tiers");
        taxTiersRates[_index] = _value;
        return true;
    }

    function setBurnThreshold(uint256 _burnThreshold) public onlyTaxOffice returns (bool) {
        burnThreshold = _burnThreshold;
        return true;
    }

    function _getVapePrice() internal view returns (uint256 _vapePrice) {
        try IOracle(vapeOracle).consult(address(this), 1e18) returns (uint144 _price) {
            return uint256(_price);
        } catch {
            revert("vApe: failed to fetch vApe price from Oracle");
        }
    }

    function _updateTaxRate(uint256 _vapePrice) internal returns (uint256){
        if (autoCalculateTax) {
            for (uint8 tierId = uint8(getTaxTiersTwapsCount().sub(1)); tierId >= 0; --tierId) {
                if (_vapePrice >= taxTiersTwaps[tierId]) {
                    require(taxTiersRates[tierId] < 10000, "tax equal or bigger to 100%");
                    taxRate = taxTiersRates[tierId];
                    return taxTiersRates[tierId];
                }
            }
        }
        return 0;
    }

    function enableAutoCalculateTax() public onlyTaxOffice {
        autoCalculateTax = true;
    }

    function disableAutoCalculateTax() public onlyTaxOffice {
        autoCalculateTax = false;
    }

    function setVapeOracle(address _vapeOracle) public onlyOperatorOrTaxOffice {
        require(_vapeOracle != address(0), "oracle address cannot be 0 address");
        vapeOracle = _vapeOracle;
    }

    function setTaxOffice(address _taxOffice) public onlyOperatorOrTaxOffice {
        require(_taxOffice != address(0), "tax office address cannot be 0 address");
        emit TaxOfficeTransferred(taxOffice, _taxOffice);
        taxOffice = _taxOffice;
    }

    function setTaxCollectorAddress(address _taxCollectorAddress) public onlyTaxOffice {
        require(_taxCollectorAddress != address(0), "tax collector address must be non-zero address");
        taxCollectorAddress = _taxCollectorAddress;
    }

    function setTaxRate(uint256 _taxRate) public onlyTaxOffice {
        require(!autoCalculateTax, "auto calculate tax cannot be enabled");
        require(_taxRate < 10000, "tax equal or bigger to 100%");
        taxRate = _taxRate;
    }

    function excludeAddress(address _address) public onlyOperatorOrTaxOffice returns (bool) {
        require(!excludedAddresses[_address], "address can't be excluded");
        excludedAddresses[_address] = true;
        return true;
    }

    function includeAddress(address _address) public onlyOperatorOrTaxOffice returns (bool) {
        require(excludedAddresses[_address], "address can't be included");
        excludedAddresses[_address] = false;
        return true;
    }

    /* ============= NOT IN USE =========== */
    /* ============= End Taxation ============= */

    /**
     * @notice Operator mints vApe to a recipient
     * @param recipient_ The address of recipient
     * @param amount_ The amount of vApe to mint to
     * @return whether the process has been done
     */
    function mint(address recipient_, uint256 amount_) public onlyOperator returns (bool) {
        uint256 balanceBefore = balanceOf(recipient_);
        _mint(recipient_, amount_);
        uint256 balanceAfter = balanceOf(recipient_);

        return balanceAfter > balanceBefore;
    }

    function burn(uint256 amount) public override {
        super.burn(amount);
    }

    function burnFrom(address account, uint256 amount) public override onlyOperator {
        super.burnFrom(account, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        uint256 currentTaxRate = 0;
        bool burnTax = false;

        if (autoCalculateTax) {
            uint256 currentVapePrice = _getVapePrice();
            currentTaxRate = _updateTaxRate(currentVapePrice);
            if (currentVapePrice < burnThreshold) {
                burnTax = true;
            }
        }

        if (currentTaxRate == 0 || excludedAddresses[sender]) {
            _transfer(sender, recipient, amount);
        } else {
            _transferWithTax(sender, recipient, amount, burnTax);
        }

        _approve(sender, _msgSender(), allowance(sender, _msgSender()).sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _transferWithTax(
        address sender,
        address recipient,
        uint256 amount,
        bool burnTax
    ) internal returns (bool) {
        uint256 taxAmount = amount.mul(taxRate).div(10000);
        uint256 amountAfterTax = amount.sub(taxAmount);

        if(burnTax) {
            // Burn tax
            super.burnFrom(sender, taxAmount);
        } else {
            // Transfer tax to tax collector
            _transfer(sender, taxCollectorAddress, taxAmount);
        }

        // Transfer amount after tax to recipient
        _transfer(sender, recipient, amountAfterTax);

        return true;
    }

    /**
     * @notice distribute to reward pool (only once)
     */
    function distributeReward(
        address _genesisPool,
        address _vapePool,
        address _airdropWallet
    ) external onlyOperator {
        require(!rewardPoolDistributed, "only can distribute once");
        require(_genesisPool != address(0), "!_genesisPool");
        require(_vapePool != address(0), "!_vapePool");
        require(_airdropWallet != address(0), "!_airdropWallet");
        rewardPoolDistributed = true;
        _mint(_genesisPool, INITIAL_GENESIS_POOL_DISTRIBUTION);
        _mint(_vapePool, INITIAL_VAPE_POOL_DISTRIBUTION);
        _mint(_airdropWallet, INITIAL_AIRDROP_WALLET_DISTRIBUTION);
    }

    function governanceRecoverUnsupported(
        IERC20 _token,
        uint256 _amount,
        address _to
    ) external onlyOperator {
        _token.transfer(_to, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"TaxOfficeTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"INITIAL_AIRDROP_WALLET_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_GENESIS_POOL_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_VAPE_POOL_DISTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoCalculateTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAutoCalculateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_genesisPool","type":"address"},{"internalType":"address","name":"_vapePool","type":"address"},{"internalType":"address","name":"_airdropWallet","type":"address"}],"name":"distributeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableAutoCalculateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"excludeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTiersRatesCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxTiersTwapsCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"governanceRecoverUnsupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"includeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isAddressExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPoolDistributed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnThreshold","type":"uint256"}],"name":"setBurnThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxCollectorAddress","type":"address"}],"name":"setTaxCollectorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxOffice","type":"address"}],"name":"setTaxOffice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"name":"setTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTaxTiersRate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTaxTiersTwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vapeOracle","type":"address"}],"name":"setVapeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxCollectorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxOffice","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxTiersRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"taxTiersTwaps","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":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vapeOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6006805460ff60a01b19169055670f43fc2c04ee0000600a819055610240604052600060809081526706f05b59d3b2000060a052670853a0d2313c000060c0526709b6e64a8ec6000060e052670b1a2bc2ec50000061010052670c7d713b49da000061012052670d2f13f7789f000061014052670de0b6b3a764000061016052670e92596fd6290000610180526101a0919091526710a741a4627800006101c05267120a871cc00200006101e05267136dcc951d8c0000610200526714d1120d7b16000061022052620000d790600c90600e62000482565b50604080516101c0810182526107d0815261076c6020820152610708918101919091526106a4606082015261064060808201526105dc60a0820181905260c0820181905260e0820181905261010082015261057861012082015261038461014082015261019061016082015260c861018082015260646101a08201526200016390600d90600e620004dd565b503480156200017157600080fd5b506040805180820182526004808252637641504560e01b602080840182815285518087019096529285528401528151919291620001b19160039162000521565b508051620001c790600490602084019062000521565b505050620001e4620001de6200027760201b60201c565b6200027b565b620001ee62000277565b600680546001600160a01b0319166001600160a01b0392831617908190556040519116906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a36200024530620002cd565b506200025a33671bc16d674ec800006200037c565b6000600955600b80546001600160a01b03191633179055620006da565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000620002d962000455565b80620002ef57506008546001600160a01b031633145b620003175760405162461bcd60e51b81526004016200030e90620005ec565b60405180910390fd5b6001600160a01b0382166000908152600e602052604090205460ff1615620003535760405162461bcd60e51b81526004016200030e90620005b5565b506001600160a01b03166000908152600e60205260409020805460ff1916600190811790915590565b6001600160a01b038216620003a55760405162461bcd60e51b81526004016200030e9062000638565b620003b3600083836200047d565b8060026000828254620003c7919062000678565b90915550506001600160a01b03821660009081526020819052604081208054839290620003f690849062000678565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200043b9085906200066f565b60405180910390a362000451600083836200047d565b5050565b6006546000906001600160a01b03166200046e62000277565b6001600160a01b031614905090565b505050565b828054828255906000526020600020908101928215620004cb579160200282015b82811115620004cb57825182906001600160401b0316905591602001919060010190620004a3565b50620004d99291506200059e565b5090565b828054828255906000526020600020908101928215620004cb579160200282015b82811115620004cb578251829061ffff16905591602001919060010190620004fe565b8280546200052f906200069d565b90600052602060002090601f016020900481019282620005535760008555620004cb565b82601f106200056e57805160ff1916838001178555620004cb565b82800160010185558215620004cb579182015b82811115620004cb57825182559160200191906001019062000581565b5b80821115620004d957600081556001016200059f565b60208082526019908201527f616464726573732063616e2774206265206578636c7564656400000000000000604082015260600190565b6020808252602c908201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860408201526b6520746178206f666669636560a01b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b600082198211156200069857634e487b7160e01b81526011600452602481fd5b500190565b600281046001821680620006b257607f821691505b60208210811415620006d457634e487b7160e01b600052602260045260246000fd5b50919050565b6125a280620006ea6000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c806370a0823111610182578063a9059cbb116100e9578063e385784f116100a2578063ef54115d1161007c578063ef54115d14610587578063f2fde38b1461059a578063ff87fc7c146105ad578063ffa8226e146105b5576102bb565b8063e385784f14610564578063ebca1bd91461056c578063ee2a95351461057f576102bb565b8063a9059cbb146104fd578063b87c5a4a14610510578063c3bdf61314610523578063c6d69a301461052b578063cf011b261461053e578063dd62ed3e14610551576102bb565b806393995d4b1161013b57806393995d4b146104ac57806395d89b41146104bf5780639662676c146104c75780639d6b5f21146104cf578063a457c2d7146104e2578063a6431bba146104f5576102bb565b806370a0823114610466578063715018a614610479578063771a3a1d1461048157806379cc6790146104895780638d3cc8181461049c5780638da5cb5b146104a4576102bb565b806342966c681161022657806354575af4116101df57806354575af41461040a578063570ca7351461041d5780635c29908d1461042557806365bbacd91461043857806366206ce91461044057806369356d4714610453576102bb565b806342966c68146103b957806342c6b4f1146103cc5780634456eda2146103df5780634e20a02c146103e75780634f6d38d0146103ef578063521181d5146103f7576102bb565b8063313ce56711610278578063313ce567146103505780633758e6ce1461036557806339509351146103785780633e5f13d41461038b5780633f07d76a1461039357806340c10f19146103a6576102bb565b806302e5fdfe146102c057806306fdde03146102de578063095ea7b3146102f357806318160ddd1461031357806323b872dd1461032857806329605e771461033b575b600080fd5b6102c86105bd565b6040516102d59190611c36565b60405180910390f35b6102e66105cc565b6040516102d59190611c88565b610306610301366004611b54565b61065f565b6040516102d59190611c7d565b61031b610681565b6040516102d591906123f4565b610306610336366004611b14565b610687565b61034e610349366004611a76565b61075d565b005b6103586107b1565b6040516102d591906123fd565b610306610373366004611a76565b6107b6565b610306610386366004611b54565b610857565b6102c861089e565b61034e6103a1366004611a76565b6108ad565b6103066103b4366004611b54565b610975565b61034e6103c7366004611bfc565b6109d0565b61031b6103da366004611bfc565b6109d9565b6103066109fa565b61031b610a20565b61031b610a2e565b61034e610405366004611aca565b610a34565b61034e610418366004611b9f565b610b4e565b6102c8610bfe565b61031b610433366004611bfc565b610c0d565b61034e610c1d565b61030661044e366004611c14565b610c56565b61034e610461366004611a76565b610d94565b61031b610474366004611a76565b610e06565b61034e610e21565b61031b610e6c565b61034e610497366004611b54565b610e72565b610306610eaa565b6102c8610eba565b6103066104ba366004611a76565b610ec9565b6102e6610f61565b610306610f70565b6103066104dd366004611bfc565b610f80565b6103066104f0366004611b54565b610fb6565b61031b611022565b61030661050b366004611b54565b611028565b61030661051e366004611c14565b611040565b6102c86110bb565b61034e610539366004611bfc565b6110ca565b61030661054c366004611a76565b611144565b61031b61055f366004611a92565b611159565b61031b611184565b61030661057a366004611a76565b611192565b61031b6111b0565b61034e610595366004611a76565b6111b6565b61034e6105a8366004611a76565b611237565b61034e6112a5565b61031b6112e4565b6007546001600160a01b031681565b6060600380546105db906124de565b80601f0160208091040260200160405190810160405280929190818152602001828054610607906124de565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b505050505090505b90565b60008061066a6112f2565b90506106778185856112f6565b5060019392505050565b60025490565b600b5460009081908190600160a01b900460ff16156106c85760006106aa6113aa565b90506106b581611459565b9250600a548110156106c657600191505b505b8115806106ed57506001600160a01b0386166000908152600e602052604090205460ff165b15610702576106fd868686611588565b610710565b61070e868686846116ac565b505b6107518661071c6112f2565b61074c87604051806060016040528060288152602001612545602891396107458c61055f6112f2565b9190611725565b6112f6565b50600195945050505050565b6107656112f2565b6001600160a01b0316610776610eba565b6001600160a01b0316146107a55760405162461bcd60e51b815260040161079c90612044565b60405180910390fd5b6107ae81611751565b50565b601290565b60006107c06109fa565b806107d557506008546001600160a01b031633145b6107f15760405162461bcd60e51b815260040161079c906122c1565b6001600160a01b0382166000908152600e602052604090205460ff161561082a5760405162461bcd60e51b815260040161079c906121bf565b506001600160a01b0381166000908152600e60205260409020805460ff191660019081179091555b919050565b6000806108626112f2565b6001600160a01b03808216600090815260016020908152604080832093891683529290522054909150610677908290869061074c90879061240b565b6008546001600160a01b031681565b6108b56109fa565b806108ca57506008546001600160a01b031633145b6108e65760405162461bcd60e51b815260040161079c906122c1565b6001600160a01b03811661090c5760405162461bcd60e51b815260040161079c90611f7a565b6008546040517f75237613d1cfb394eb7979839ecbeacaca4592ef0cf96791979625803948a6019161094b916001600160a01b03909116908490611c4a565b60405180910390a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546000906001600160a01b031633146109a25760405162461bcd60e51b815260040161079c906120c7565b60006109ad84610e06565b90506109b984846117cf565b60006109c485610e06565b91909111949350505050565b6107ae81611897565b600c81815481106109e957600080fd5b600091825260209091200154905081565b6006546000906001600160a01b0316610a116112f2565b6001600160a01b031614905090565b6902544faa778090e0000081565b600a5481565b6006546001600160a01b03163314610a5e5760405162461bcd60e51b815260040161079c906120c7565b600654600160a01b900460ff1615610a885760405162461bcd60e51b815260040161079c90611d42565b6001600160a01b038316610aae5760405162461bcd60e51b815260040161079c90612351565b6001600160a01b038216610ad45760405162461bcd60e51b815260040161079c90611cdb565b6001600160a01b038116610afa5760405162461bcd60e51b815260040161079c9061210b565b6006805460ff60a01b1916600160a01b179055610b21836902544faa778090e000006117cf565b610b3582691da56a4b0835bf8000006117cf565b610b49816901e7e4171bf4d3a000006117cf565b505050565b6006546001600160a01b03163314610b785760405162461bcd60e51b815260040161079c906120c7565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610ba69084908690600401611c64565b602060405180830381600087803b158015610bc057600080fd5b505af1158015610bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf89190611b7f565b50505050565b6006546001600160a01b031690565b600d81815481106109e957600080fd5b6008546001600160a01b03163314610c475760405162461bcd60e51b815260040161079c9061200d565b600b805460ff60a01b19169055565b6008546000906001600160a01b03163314610c835760405162461bcd60e51b815260040161079c9061200d565b610c8b611022565b8360ff1610610cac5760405162461bcd60e51b815260040161079c90612134565b60ff831615610cf957600c610cc260018561249e565b60ff1681548110610ce357634e487b7160e01b600052603260045260246000fd5b90600052602060002001548211610cf957600080fd5b610d0c6001610d06611022565b906118a8565b8360ff161015610d5a57600c610d23846001612423565b60ff1681548110610d4457634e487b7160e01b600052603260045260246000fd5b90600052602060002001548210610d5a57600080fd5b81600c8460ff1681548110610d7f57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015550600192915050565b6008546001600160a01b03163314610dbe5760405162461bcd60e51b815260040161079c9061200d565b6001600160a01b038116610de45760405162461bcd60e51b815260040161079c90612079565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b610e296112f2565b6001600160a01b0316610e3a610eba565b6001600160a01b031614610e605760405162461bcd60e51b815260040161079c90612044565b610e6a60006118bb565b565b60095481565b6006546001600160a01b03163314610e9c5760405162461bcd60e51b815260040161079c906120c7565b610ea6828261190d565b5050565b600b54600160a01b900460ff1681565b6005546001600160a01b031690565b6000610ed36109fa565b80610ee857506008546001600160a01b031633145b610f045760405162461bcd60e51b815260040161079c906122c1565b6001600160a01b0382166000908152600e602052604090205460ff16610f3c5760405162461bcd60e51b815260040161079c90611ef7565b506001600160a01b03166000908152600e60205260409020805460ff19169055600190565b6060600480546105db906124de565b600654600160a01b900460ff1681565b6008546000906001600160a01b03163314610fad5760405162461bcd60e51b815260040161079c9061200d565b50600a55600190565b600080610fc16112f2565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091508381101561100a5760405162461bcd60e51b815260040161079c90612378565b61101782868684036112f6565b506001949350505050565b600c5490565b6000806110336112f2565b9050610677818585611588565b6008546000906001600160a01b0316331461106d5760405162461bcd60e51b815260040161079c9061200d565b6110756111b0565b8360ff16106110965760405162461bcd60e51b815260040161079c90612134565b81600d8460ff1681548110610d7f57634e487b7160e01b600052603260045260246000fd5b600b546001600160a01b031681565b6008546001600160a01b031633146110f45760405162461bcd60e51b815260040161079c9061200d565b600b54600160a01b900460ff161561111e5760405162461bcd60e51b815260040161079c90612238565b612710811061113f5760405162461bcd60e51b815260040161079c90611d79565b600955565b600e6020526000908152604090205460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b691da56a4b0835bf80000081565b6001600160a01b03166000908152600e602052604090205460ff1690565b600d5490565b6111be6109fa565b806111d357506008546001600160a01b031633145b6111ef5760405162461bcd60e51b815260040161079c906122c1565b6001600160a01b0381166112155760405162461bcd60e51b815260040161079c906121f6565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b61123f6112f2565b6001600160a01b0316611250610eba565b6001600160a01b0316146112765760405162461bcd60e51b815260040161079c90612044565b6001600160a01b03811661129c5760405162461bcd60e51b815260040161079c90611df2565b6107ae816118bb565b6008546001600160a01b031633146112cf5760405162461bcd60e51b815260040161079c9061200d565b600b805460ff60a01b1916600160a01b179055565b6901e7e4171bf4d3a0000081565b3390565b6001600160a01b03831661131c5760405162461bcd60e51b815260040161079c9061230d565b6001600160a01b0382166113425760405162461bcd60e51b815260040161079c90611e38565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061139d9085906123f4565b60405180910390a3505050565b600754604051633ddac95360e01b81526000916001600160a01b031690633ddac953906113e5903090670de0b6b3a764000090600401611c64565b60206040518083038186803b1580156113fd57600080fd5b505afa92505050801561142d575060408051601f3d908101601f1916820190925261142a91810190611bd5565b60015b6114495760405162461bcd60e51b815260040161079c90611f2e565b6001600160901b0316905061065c565b600b54600090600160a01b900460ff161561158057600061147d6001610d06611022565b90505b600c8160ff16815481106114a457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154831061157057612710600d8260ff16815481106114dc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154106115045760405162461bcd60e51b815260040161079c90611d79565b600d8160ff168154811061152857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600981905550600d8160ff168154811061155d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154915050610852565b611579816124c1565b9050611480565b506000919050565b6001600160a01b0383166115ae5760405162461bcd60e51b815260040161079c9061227c565b6001600160a01b0382166115d45760405162461bcd60e51b815260040161079c90611cff565b6115df838383610b49565b6001600160a01b038316600090815260208190526040902054818110156116185760405162461bcd60e51b815260040161079c90611eb1565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061164f90849061240b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161169991906123f4565b60405180910390a3610bf8848484610b49565b6000806116d06127106116ca6009548761192990919063ffffffff16565b90611935565b905060006116de85836118a8565b905083156116f5576116f0878361190d565b61170d565b600b5461170d9088906001600160a01b031684611588565b611718878783611588565b5060019695505050505050565b600081848411156117495760405162461bcd60e51b815260040161079c9190611c88565b505050900390565b6001600160a01b0381166117775760405162461bcd60e51b815260040161079c90611fc0565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166117f55760405162461bcd60e51b815260040161079c906123bd565b61180160008383610b49565b8060026000828254611813919061240b565b90915550506001600160a01b0382166000908152602081905260408120805483929061184090849061240b565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906118839085906123f4565b60405180910390a3610ea660008383610b49565b6107ae6118a26112f2565b82611941565b60006118b48284612487565b9392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61191f826119196112f2565b83611a32565b610ea68282611941565b60006118b48284612468565b60006118b48284612448565b6001600160a01b0382166119675760405162461bcd60e51b815260040161079c9061217e565b61197382600083610b49565b6001600160a01b038216600090815260208190526040902054818110156119ac5760405162461bcd60e51b815260040161079c90611db0565b6001600160a01b03831660009081526020819052604081208383039055600280548492906119db908490612487565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611a1e9086906123f4565b60405180910390a3610b4983600084610b49565b6000611a3e8484611159565b90506000198114610bf85781811015611a695760405162461bcd60e51b815260040161079c90611e7a565b610bf884848484036112f6565b600060208284031215611a87578081fd5b81356118b48161252f565b60008060408385031215611aa4578081fd5b8235611aaf8161252f565b91506020830135611abf8161252f565b809150509250929050565b600080600060608486031215611ade578081fd5b8335611ae98161252f565b92506020840135611af98161252f565b91506040840135611b098161252f565b809150509250925092565b600080600060608486031215611b28578283fd5b8335611b338161252f565b92506020840135611b438161252f565b929592945050506040919091013590565b60008060408385031215611b66578182fd5b8235611b718161252f565b946020939093013593505050565b600060208284031215611b90578081fd5b815180151581146118b4578182fd5b600080600060608486031215611bb3578283fd5b8335611bbe8161252f565b9250602084013591506040840135611b098161252f565b600060208284031215611be6578081fd5b81516001600160901b03811681146118b4578182fd5b600060208284031215611c0d578081fd5b5035919050565b60008060408385031215611c26578182fd5b823560ff81168114611b71578283fd5b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b81811015611cb457858101830151858201604001528201611c98565b81811115611cc55783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600a90820152690857dd985c19541bdbdb60b21b604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526018908201527f6f6e6c792063616e2064697374726962757465206f6e63650000000000000000604082015260600190565b6020808252601b908201527f74617820657175616c206f722062696767657220746f20313030250000000000604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526019908201527f616464726573732063616e277420626520696e636c7564656400000000000000604082015260600190565b6020808252602c908201527f764170653a206661696c656420746f206665746368207641706520707269636560408201526b2066726f6d204f7261636c6560a01b606082015260800190565b60208082526026908201527f746178206f666669636520616464726573732063616e6e6f742062652030206160408201526564647265737360d01b606082015260800190565b6020808252602d908201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260408201526c103732bb9037b832b930ba37b960991b606082015260800190565b6020808252601c908201527f43616c6c6572206973206e6f742074686520746178206f666669636500000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f74617820636f6c6c6563746f722061646472657373206d757374206265206e6f60408201526d6e2d7a65726f206164647265737360901b606082015260800190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6020808252600f908201526e0857d85a5c991c9bdc15d85b1b195d608a1b604082015260600190565b6020808252602a908201527f496e6465782068617320746f206c6f776572207468616e20636f756e74206f666040820152692074617820746965727360b01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526019908201527f616464726573732063616e2774206265206578636c7564656400000000000000604082015260600190565b60208082526022908201527f6f7261636c6520616464726573732063616e6e6f742062652030206164647265604082015261737360f01b606082015260800190565b60208082526024908201527f6175746f2063616c63756c617465207461782063616e6e6f7420626520656e61604082015263189b195960e21b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602c908201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860408201526b6520746178206f666669636560a01b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252600d908201526c0857d9d95b995cda5cd41bdbdb609a1b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b6000821982111561241e5761241e612519565b500190565b600060ff821660ff84168060ff0382111561244057612440612519565b019392505050565b60008261246357634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561248257612482612519565b500290565b60008282101561249957612499612519565b500390565b600060ff821660ff8416808210156124b8576124b8612519565b90039392505050565b600060ff8216806124d4576124d4612519565b6000190192915050565b6002810460018216806124f257607f821691505b6020821081141561251357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146107ae57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212200e1b63a77c29b6f8e9bada9a29529a715aa554b3af8441a7c8cd038d327fdd0964736f6c63430008010033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c806370a0823111610182578063a9059cbb116100e9578063e385784f116100a2578063ef54115d1161007c578063ef54115d14610587578063f2fde38b1461059a578063ff87fc7c146105ad578063ffa8226e146105b5576102bb565b8063e385784f14610564578063ebca1bd91461056c578063ee2a95351461057f576102bb565b8063a9059cbb146104fd578063b87c5a4a14610510578063c3bdf61314610523578063c6d69a301461052b578063cf011b261461053e578063dd62ed3e14610551576102bb565b806393995d4b1161013b57806393995d4b146104ac57806395d89b41146104bf5780639662676c146104c75780639d6b5f21146104cf578063a457c2d7146104e2578063a6431bba146104f5576102bb565b806370a0823114610466578063715018a614610479578063771a3a1d1461048157806379cc6790146104895780638d3cc8181461049c5780638da5cb5b146104a4576102bb565b806342966c681161022657806354575af4116101df57806354575af41461040a578063570ca7351461041d5780635c29908d1461042557806365bbacd91461043857806366206ce91461044057806369356d4714610453576102bb565b806342966c68146103b957806342c6b4f1146103cc5780634456eda2146103df5780634e20a02c146103e75780634f6d38d0146103ef578063521181d5146103f7576102bb565b8063313ce56711610278578063313ce567146103505780633758e6ce1461036557806339509351146103785780633e5f13d41461038b5780633f07d76a1461039357806340c10f19146103a6576102bb565b806302e5fdfe146102c057806306fdde03146102de578063095ea7b3146102f357806318160ddd1461031357806323b872dd1461032857806329605e771461033b575b600080fd5b6102c86105bd565b6040516102d59190611c36565b60405180910390f35b6102e66105cc565b6040516102d59190611c88565b610306610301366004611b54565b61065f565b6040516102d59190611c7d565b61031b610681565b6040516102d591906123f4565b610306610336366004611b14565b610687565b61034e610349366004611a76565b61075d565b005b6103586107b1565b6040516102d591906123fd565b610306610373366004611a76565b6107b6565b610306610386366004611b54565b610857565b6102c861089e565b61034e6103a1366004611a76565b6108ad565b6103066103b4366004611b54565b610975565b61034e6103c7366004611bfc565b6109d0565b61031b6103da366004611bfc565b6109d9565b6103066109fa565b61031b610a20565b61031b610a2e565b61034e610405366004611aca565b610a34565b61034e610418366004611b9f565b610b4e565b6102c8610bfe565b61031b610433366004611bfc565b610c0d565b61034e610c1d565b61030661044e366004611c14565b610c56565b61034e610461366004611a76565b610d94565b61031b610474366004611a76565b610e06565b61034e610e21565b61031b610e6c565b61034e610497366004611b54565b610e72565b610306610eaa565b6102c8610eba565b6103066104ba366004611a76565b610ec9565b6102e6610f61565b610306610f70565b6103066104dd366004611bfc565b610f80565b6103066104f0366004611b54565b610fb6565b61031b611022565b61030661050b366004611b54565b611028565b61030661051e366004611c14565b611040565b6102c86110bb565b61034e610539366004611bfc565b6110ca565b61030661054c366004611a76565b611144565b61031b61055f366004611a92565b611159565b61031b611184565b61030661057a366004611a76565b611192565b61031b6111b0565b61034e610595366004611a76565b6111b6565b61034e6105a8366004611a76565b611237565b61034e6112a5565b61031b6112e4565b6007546001600160a01b031681565b6060600380546105db906124de565b80601f0160208091040260200160405190810160405280929190818152602001828054610607906124de565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b505050505090505b90565b60008061066a6112f2565b90506106778185856112f6565b5060019392505050565b60025490565b600b5460009081908190600160a01b900460ff16156106c85760006106aa6113aa565b90506106b581611459565b9250600a548110156106c657600191505b505b8115806106ed57506001600160a01b0386166000908152600e602052604090205460ff165b15610702576106fd868686611588565b610710565b61070e868686846116ac565b505b6107518661071c6112f2565b61074c87604051806060016040528060288152602001612545602891396107458c61055f6112f2565b9190611725565b6112f6565b50600195945050505050565b6107656112f2565b6001600160a01b0316610776610eba565b6001600160a01b0316146107a55760405162461bcd60e51b815260040161079c90612044565b60405180910390fd5b6107ae81611751565b50565b601290565b60006107c06109fa565b806107d557506008546001600160a01b031633145b6107f15760405162461bcd60e51b815260040161079c906122c1565b6001600160a01b0382166000908152600e602052604090205460ff161561082a5760405162461bcd60e51b815260040161079c906121bf565b506001600160a01b0381166000908152600e60205260409020805460ff191660019081179091555b919050565b6000806108626112f2565b6001600160a01b03808216600090815260016020908152604080832093891683529290522054909150610677908290869061074c90879061240b565b6008546001600160a01b031681565b6108b56109fa565b806108ca57506008546001600160a01b031633145b6108e65760405162461bcd60e51b815260040161079c906122c1565b6001600160a01b03811661090c5760405162461bcd60e51b815260040161079c90611f7a565b6008546040517f75237613d1cfb394eb7979839ecbeacaca4592ef0cf96791979625803948a6019161094b916001600160a01b03909116908490611c4a565b60405180910390a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546000906001600160a01b031633146109a25760405162461bcd60e51b815260040161079c906120c7565b60006109ad84610e06565b90506109b984846117cf565b60006109c485610e06565b91909111949350505050565b6107ae81611897565b600c81815481106109e957600080fd5b600091825260209091200154905081565b6006546000906001600160a01b0316610a116112f2565b6001600160a01b031614905090565b6902544faa778090e0000081565b600a5481565b6006546001600160a01b03163314610a5e5760405162461bcd60e51b815260040161079c906120c7565b600654600160a01b900460ff1615610a885760405162461bcd60e51b815260040161079c90611d42565b6001600160a01b038316610aae5760405162461bcd60e51b815260040161079c90612351565b6001600160a01b038216610ad45760405162461bcd60e51b815260040161079c90611cdb565b6001600160a01b038116610afa5760405162461bcd60e51b815260040161079c9061210b565b6006805460ff60a01b1916600160a01b179055610b21836902544faa778090e000006117cf565b610b3582691da56a4b0835bf8000006117cf565b610b49816901e7e4171bf4d3a000006117cf565b505050565b6006546001600160a01b03163314610b785760405162461bcd60e51b815260040161079c906120c7565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90610ba69084908690600401611c64565b602060405180830381600087803b158015610bc057600080fd5b505af1158015610bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf89190611b7f565b50505050565b6006546001600160a01b031690565b600d81815481106109e957600080fd5b6008546001600160a01b03163314610c475760405162461bcd60e51b815260040161079c9061200d565b600b805460ff60a01b19169055565b6008546000906001600160a01b03163314610c835760405162461bcd60e51b815260040161079c9061200d565b610c8b611022565b8360ff1610610cac5760405162461bcd60e51b815260040161079c90612134565b60ff831615610cf957600c610cc260018561249e565b60ff1681548110610ce357634e487b7160e01b600052603260045260246000fd5b90600052602060002001548211610cf957600080fd5b610d0c6001610d06611022565b906118a8565b8360ff161015610d5a57600c610d23846001612423565b60ff1681548110610d4457634e487b7160e01b600052603260045260246000fd5b90600052602060002001548210610d5a57600080fd5b81600c8460ff1681548110610d7f57634e487b7160e01b600052603260045260246000fd5b60009182526020909120015550600192915050565b6008546001600160a01b03163314610dbe5760405162461bcd60e51b815260040161079c9061200d565b6001600160a01b038116610de45760405162461bcd60e51b815260040161079c90612079565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b610e296112f2565b6001600160a01b0316610e3a610eba565b6001600160a01b031614610e605760405162461bcd60e51b815260040161079c90612044565b610e6a60006118bb565b565b60095481565b6006546001600160a01b03163314610e9c5760405162461bcd60e51b815260040161079c906120c7565b610ea6828261190d565b5050565b600b54600160a01b900460ff1681565b6005546001600160a01b031690565b6000610ed36109fa565b80610ee857506008546001600160a01b031633145b610f045760405162461bcd60e51b815260040161079c906122c1565b6001600160a01b0382166000908152600e602052604090205460ff16610f3c5760405162461bcd60e51b815260040161079c90611ef7565b506001600160a01b03166000908152600e60205260409020805460ff19169055600190565b6060600480546105db906124de565b600654600160a01b900460ff1681565b6008546000906001600160a01b03163314610fad5760405162461bcd60e51b815260040161079c9061200d565b50600a55600190565b600080610fc16112f2565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091508381101561100a5760405162461bcd60e51b815260040161079c90612378565b61101782868684036112f6565b506001949350505050565b600c5490565b6000806110336112f2565b9050610677818585611588565b6008546000906001600160a01b0316331461106d5760405162461bcd60e51b815260040161079c9061200d565b6110756111b0565b8360ff16106110965760405162461bcd60e51b815260040161079c90612134565b81600d8460ff1681548110610d7f57634e487b7160e01b600052603260045260246000fd5b600b546001600160a01b031681565b6008546001600160a01b031633146110f45760405162461bcd60e51b815260040161079c9061200d565b600b54600160a01b900460ff161561111e5760405162461bcd60e51b815260040161079c90612238565b612710811061113f5760405162461bcd60e51b815260040161079c90611d79565b600955565b600e6020526000908152604090205460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b691da56a4b0835bf80000081565b6001600160a01b03166000908152600e602052604090205460ff1690565b600d5490565b6111be6109fa565b806111d357506008546001600160a01b031633145b6111ef5760405162461bcd60e51b815260040161079c906122c1565b6001600160a01b0381166112155760405162461bcd60e51b815260040161079c906121f6565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b61123f6112f2565b6001600160a01b0316611250610eba565b6001600160a01b0316146112765760405162461bcd60e51b815260040161079c90612044565b6001600160a01b03811661129c5760405162461bcd60e51b815260040161079c90611df2565b6107ae816118bb565b6008546001600160a01b031633146112cf5760405162461bcd60e51b815260040161079c9061200d565b600b805460ff60a01b1916600160a01b179055565b6901e7e4171bf4d3a0000081565b3390565b6001600160a01b03831661131c5760405162461bcd60e51b815260040161079c9061230d565b6001600160a01b0382166113425760405162461bcd60e51b815260040161079c90611e38565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061139d9085906123f4565b60405180910390a3505050565b600754604051633ddac95360e01b81526000916001600160a01b031690633ddac953906113e5903090670de0b6b3a764000090600401611c64565b60206040518083038186803b1580156113fd57600080fd5b505afa92505050801561142d575060408051601f3d908101601f1916820190925261142a91810190611bd5565b60015b6114495760405162461bcd60e51b815260040161079c90611f2e565b6001600160901b0316905061065c565b600b54600090600160a01b900460ff161561158057600061147d6001610d06611022565b90505b600c8160ff16815481106114a457634e487b7160e01b600052603260045260246000fd5b9060005260206000200154831061157057612710600d8260ff16815481106114dc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154106115045760405162461bcd60e51b815260040161079c90611d79565b600d8160ff168154811061152857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600981905550600d8160ff168154811061155d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154915050610852565b611579816124c1565b9050611480565b506000919050565b6001600160a01b0383166115ae5760405162461bcd60e51b815260040161079c9061227c565b6001600160a01b0382166115d45760405162461bcd60e51b815260040161079c90611cff565b6115df838383610b49565b6001600160a01b038316600090815260208190526040902054818110156116185760405162461bcd60e51b815260040161079c90611eb1565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061164f90849061240b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161169991906123f4565b60405180910390a3610bf8848484610b49565b6000806116d06127106116ca6009548761192990919063ffffffff16565b90611935565b905060006116de85836118a8565b905083156116f5576116f0878361190d565b61170d565b600b5461170d9088906001600160a01b031684611588565b611718878783611588565b5060019695505050505050565b600081848411156117495760405162461bcd60e51b815260040161079c9190611c88565b505050900390565b6001600160a01b0381166117775760405162461bcd60e51b815260040161079c90611fc0565b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166117f55760405162461bcd60e51b815260040161079c906123bd565b61180160008383610b49565b8060026000828254611813919061240b565b90915550506001600160a01b0382166000908152602081905260408120805483929061184090849061240b565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906118839085906123f4565b60405180910390a3610ea660008383610b49565b6107ae6118a26112f2565b82611941565b60006118b48284612487565b9392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61191f826119196112f2565b83611a32565b610ea68282611941565b60006118b48284612468565b60006118b48284612448565b6001600160a01b0382166119675760405162461bcd60e51b815260040161079c9061217e565b61197382600083610b49565b6001600160a01b038216600090815260208190526040902054818110156119ac5760405162461bcd60e51b815260040161079c90611db0565b6001600160a01b03831660009081526020819052604081208383039055600280548492906119db908490612487565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611a1e9086906123f4565b60405180910390a3610b4983600084610b49565b6000611a3e8484611159565b90506000198114610bf85781811015611a695760405162461bcd60e51b815260040161079c90611e7a565b610bf884848484036112f6565b600060208284031215611a87578081fd5b81356118b48161252f565b60008060408385031215611aa4578081fd5b8235611aaf8161252f565b91506020830135611abf8161252f565b809150509250929050565b600080600060608486031215611ade578081fd5b8335611ae98161252f565b92506020840135611af98161252f565b91506040840135611b098161252f565b809150509250925092565b600080600060608486031215611b28578283fd5b8335611b338161252f565b92506020840135611b438161252f565b929592945050506040919091013590565b60008060408385031215611b66578182fd5b8235611b718161252f565b946020939093013593505050565b600060208284031215611b90578081fd5b815180151581146118b4578182fd5b600080600060608486031215611bb3578283fd5b8335611bbe8161252f565b9250602084013591506040840135611b098161252f565b600060208284031215611be6578081fd5b81516001600160901b03811681146118b4578182fd5b600060208284031215611c0d578081fd5b5035919050565b60008060408385031215611c26578182fd5b823560ff81168114611b71578283fd5b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b81811015611cb457858101830151858201604001528201611c98565b81811115611cc55783604083870101525b50601f01601f1916929092016040019392505050565b6020808252600a90820152690857dd985c19541bdbdb60b21b604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526018908201527f6f6e6c792063616e2064697374726962757465206f6e63650000000000000000604082015260600190565b6020808252601b908201527f74617820657175616c206f722062696767657220746f20313030250000000000604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526019908201527f616464726573732063616e277420626520696e636c7564656400000000000000604082015260600190565b6020808252602c908201527f764170653a206661696c656420746f206665746368207641706520707269636560408201526b2066726f6d204f7261636c6560a01b606082015260800190565b60208082526026908201527f746178206f666669636520616464726573732063616e6e6f742062652030206160408201526564647265737360d01b606082015260800190565b6020808252602d908201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260408201526c103732bb9037b832b930ba37b960991b606082015260800190565b6020808252601c908201527f43616c6c6572206973206e6f742074686520746178206f666669636500000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f74617820636f6c6c6563746f722061646472657373206d757374206265206e6f60408201526d6e2d7a65726f206164647265737360901b606082015260800190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6020808252600f908201526e0857d85a5c991c9bdc15d85b1b195d608a1b604082015260600190565b6020808252602a908201527f496e6465782068617320746f206c6f776572207468616e20636f756e74206f666040820152692074617820746965727360b01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526019908201527f616464726573732063616e2774206265206578636c7564656400000000000000604082015260600190565b60208082526022908201527f6f7261636c6520616464726573732063616e6e6f742062652030206164647265604082015261737360f01b606082015260800190565b60208082526024908201527f6175746f2063616c63756c617465207461782063616e6e6f7420626520656e61604082015263189b195960e21b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602c908201527f43616c6c6572206973206e6f7420746865206f70657261746f72206f7220746860408201526b6520746178206f666669636560a01b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252600d908201526c0857d9d95b995cda5cd41bdbdb609a1b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b6000821982111561241e5761241e612519565b500190565b600060ff821660ff84168060ff0382111561244057612440612519565b019392505050565b60008261246357634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561248257612482612519565b500290565b60008282101561249957612499612519565b500390565b600060ff821660ff8416808210156124b8576124b8612519565b90039392505050565b600060ff8216806124d4576124d4612519565b6000190192915050565b6002810460018216806124f257607f821691505b6020821081141561251357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146107ae57600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212200e1b63a77c29b6f8e9bada9a29529a715aa554b3af8441a7c8cd038d327fdd0964736f6c63430008010033

Deployed Bytecode Sourcemap

29736:9736:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30490:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6710:100;;;:::i;:::-;;;;;;;:::i;9061:201::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7830:108::-;;;:::i;:::-;;;;;;;:::i;37039:850::-;;;;;;:::i;:::-;;:::i;28949:115::-;;;;;;:::i;:::-;;:::i;:::-;;7672:93;;;:::i;:::-;;;;;;;:::i;35691:240::-;;;;;;:::i;:::-;;:::i;10546:::-;;;;;;:::i;:::-;;:::i;30556:24::-;;;:::i;34920:259::-;;;;;;:::i;:::-;;:::i;36512:290::-;;;;;;:::i;:::-;;:::i;36810:83::-;;;;;;:::i;:::-;;:::i;30947:134::-;;;;;;:::i;:::-;;:::i;28841:100::-;;;:::i;29913:71::-;;;:::i;30701:38::-;;;:::i;38630:644::-;;;;;;:::i;:::-;;:::i;39282:187::-;;;;;;:::i;:::-;;:::i;28613:85::-;;;:::i;31088:113::-;;;;;;:::i;:::-;;:::i;34604:99::-;;;:::i;32603:545::-;;;;;;:::i;:::-;;:::i;35187:248::-;;;;;;:::i;:::-;;:::i;8001:127::-;;;;;;:::i;:::-;;:::i;27429:103::-;;;:::i;30614:22::-;;;:::i;36901:130::-;;;;;;:::i;:::-;;:::i;30892:28::-;;;:::i;26778:87::-;;;:::i;35939:240::-;;;;;;:::i;:::-;;:::i;6929:104::-;;;:::i;30302:41::-;;;:::i;33488:157::-;;;;;;:::i;:::-;;:::i;11289:438::-;;;;;;:::i;:::-;;:::i;32224:115::-;;;:::i;8334:193::-;;;;;;:::i;:::-;;:::i;33156:324::-;;;;;;:::i;:::-;;:::i;30790:34::-;;;:::i;35443:240::-;;;;;;:::i;:::-;;:::i;31253:49::-;;;;;;:::i;:::-;;:::i;8590:151::-;;;;;;:::i;:::-;;:::i;30049:69::-;;;:::i;32470:125::-;;;;;;:::i;:::-;;:::i;32347:115::-;;;:::i;34711:201::-;;;;;;:::i;:::-;;:::i;27687:::-;;;;;;:::i;:::-;;:::i;34499:97::-;;;:::i;30166:72::-;;;:::i;30490:25::-;;;-1:-1:-1;;;;;30490:25:0;;:::o;6710:100::-;6764:13;6797:5;6790:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6710:100;;:::o;9061:201::-;9144:4;9161:13;9177:12;:10;:12::i;:::-;9161:28;;9200:32;9209:5;9216:7;9225:6;9200:8;:32::i;:::-;-1:-1:-1;9250:4:0;;9061:201;-1:-1:-1;;;9061:201:0:o;7830:108::-;7918:12;;7830:108;:::o;37039:850::-;37262:16;;37171:4;;;;;;-1:-1:-1;;;37262:16:0;;;;37258:256;;;37295:24;37322:15;:13;:15::i;:::-;37295:42;;37369:32;37384:16;37369:14;:32::i;:::-;37352:49;;37439:13;;37420:16;:32;37416:87;;;37483:4;37473:14;;37416:87;37258:256;;37530:19;;;:48;;-1:-1:-1;;;;;;37553:25:0;;;;;;:17;:25;;;;;;;;37530:48;37526:202;;;37595:36;37605:6;37613:9;37624:6;37595:9;:36::i;:::-;37526:202;;;37664:52;37681:6;37689:9;37700:6;37708:7;37664:16;:52::i;:::-;;37526:202;37740:119;37749:6;37757:12;:10;:12::i;:::-;37771:87;37807:6;37771:87;;;;;;;;;;;;;;;;;:31;37781:6;37789:12;:10;:12::i;37771:31::-;:35;:87;:35;:87::i;:::-;37740:8;:119::i;:::-;-1:-1:-1;37877:4:0;;37039:850;-1:-1:-1;;;;;37039:850:0:o;28949:115::-;27009:12;:10;:12::i;:::-;-1:-1:-1;;;;;26998:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26998:23:0;;26990:68;;;;-1:-1:-1;;;26990:68:0;;;;;;;:::i;:::-;;;;;;;;;29025:31:::1;29043:12;29025:17;:31::i;:::-;28949:115:::0;:::o;7672:93::-;7755:2;7672:93;:::o;35691:240::-;35773:4;31568:12;:10;:12::i;:::-;:39;;;-1:-1:-1;31584:9:0;;-1:-1:-1;;;;;31584:9:0;31597:10;31584:23;31568:39;31560:96;;;;-1:-1:-1;;;31560:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35799:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;35798:28;35790:66;;;;-1:-1:-1::0;;;35790:66:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;35867:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;:34;;-1:-1:-1;;35867:34:0::1;35897:4;35867:34:::0;;::::1;::::0;;;31667:1:::1;35691:240:::0;;;:::o;10546:::-;10634:4;10651:13;10667:12;:10;:12::i;:::-;-1:-1:-1;;;;;10715:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;10651:28;;-1:-1:-1;10690:66:0;;10651:28;;10706:7;;10715:40;;10745:10;;10715:40;:::i;30556:24::-;;;-1:-1:-1;;;;;30556:24:0;;:::o;34920:259::-;31568:12;:10;:12::i;:::-;:39;;;-1:-1:-1;31584:9:0;;-1:-1:-1;;;;;31584:9:0;31597:10;31584:23;31568:39;31560:96;;;;-1:-1:-1;;;31560:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35012:24:0;::::1;35004:75;;;;-1:-1:-1::0;;;35004:75:0::1;;;;;;;:::i;:::-;35116:9;::::0;35095:43:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;35116:9:0;;::::1;::::0;35127:10;;35095:43:::1;:::i;:::-;;;;;;;;35149:9;:22:::0;;-1:-1:-1;;;;;;35149:22:0::1;-1:-1:-1::0;;;;;35149:22:0;;;::::1;::::0;;;::::1;::::0;;34920:259::o;36512:290::-;28749:9;;36592:4;;-1:-1:-1;;;;;28749:9:0;28762:10;28749:23;28741:72;;;;-1:-1:-1;;;28741:72:0;;;;;;;:::i;:::-;36609:21:::1;36633;36643:10;36633:9;:21::i;:::-;36609:45;;36665:26;36671:10;36683:7;36665:5;:26::i;:::-;36702:20;36725:21;36735:10;36725:9;:21::i;:::-;36766:28:::0;;;::::1;::::0;36512:290;-1:-1:-1;;;;36512:290:0:o;36810:83::-;36867:18;36878:6;36867:10;:18::i;30947:134::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30947:134:0;:::o;28841:100::-;28924:9;;28884:4;;-1:-1:-1;;;;;28924:9:0;28908:12;:10;:12::i;:::-;-1:-1:-1;;;;;28908:25:0;;28901:32;;28841:100;:::o;29913:71::-;29973:11;29913:71;:::o;30701:38::-;;;;:::o;38630:644::-;28749:9;;-1:-1:-1;;;;;28749:9:0;28762:10;28749:23;28741:72;;;;-1:-1:-1;;;28741:72:0;;;;;;;:::i;:::-;38797:21:::1;::::0;-1:-1:-1;;;38797:21:0;::::1;;;38796:22;38788:59;;;;-1:-1:-1::0;;;38788:59:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38866:26:0;::::1;38858:52;;;;-1:-1:-1::0;;;38858:52:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38929:23:0;::::1;38921:46;;;;-1:-1:-1::0;;;38921:46:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38986:28:0;::::1;38978:56;;;;-1:-1:-1::0;;;38978:56:0::1;;;;;;;:::i;:::-;39045:21;:28:::0;;-1:-1:-1;;;;39045:28:0::1;-1:-1:-1::0;;;39045:28:0::1;::::0;;39084:54:::1;39090:12:::0;29973:11:::1;39084:5;:54::i;:::-;39149:48;39155:9;30106:12;39149:5;:48::i;:::-;39208:58;39214:14;30228:10;39208:5;:58::i;:::-;38630:644:::0;;;:::o;39282:187::-;28749:9;;-1:-1:-1;;;;;28749:9:0;28762:10;28749:23;28741:72;;;;-1:-1:-1;;;28741:72:0;;;;;;;:::i;:::-;39432:29:::1;::::0;-1:-1:-1;;;39432:29:0;;-1:-1:-1;;;;;39432:15:0;::::1;::::0;::::1;::::0;:29:::1;::::0;39448:3;;39453:7;;39432:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39282:187:::0;;;:::o;28613:85::-;28681:9;;-1:-1:-1;;;;;28681:9:0;28613:85;:::o;31088:113::-;;;;;;;;;;;;34604:99;31430:9;;-1:-1:-1;;;;;31430:9:0;31443:10;31430:23;31422:64;;;;-1:-1:-1;;;31422:64:0;;;;;;;:::i;:::-;34671:16:::1;:24:::0;;-1:-1:-1;;;;34671:24:0::1;::::0;;34604:99::o;32603:545::-;31430:9;;32688:4;;-1:-1:-1;;;;;31430:9:0;31443:10;31430:23;31422:64;;;;-1:-1:-1;;;31422:64:0;;;;;;;:::i;:::-;32786:23:::1;:21;:23::i;:::-;32777:6;:32;;;32769:87;;;;-1:-1:-1::0;;;32769:87:0::1;;;;;;;:::i;:::-;32871:10;::::0;::::1;::::0;32867:86:::1;;32915:13;32929:10;32938:1;32929:6:::0;:10:::1;:::i;:::-;32915:25;;;;;;;;-1:-1:-1::0;;;32915:25:0::1;;;;;;;;;;;;;;;;;32906:6;:34;32898:43;;;::::0;::::1;;32976:30;33004:1;32976:23;:21;:23::i;:::-;:27:::0;::::1;:30::i;:::-;32967:6;:39;;;32963:115;;;33040:13;33054:10;:6:::0;33063:1:::1;33054:10;:::i;:::-;33040:25;;;;;;;;-1:-1:-1::0;;;33040:25:0::1;;;;;;;;;;;;;;;;;33031:6;:34;33023:43;;;::::0;::::1;;33112:6;33088:13;33102:6;33088:21;;;;;;;;-1:-1:-1::0;;;33088:21:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:30:::0;-1:-1:-1;33136:4:0::1;32603:545:::0;;;;:::o;35187:248::-;31430:9;;-1:-1:-1;;;;;31430:9:0;31443:10;31430:23;31422:64;;;;-1:-1:-1;;;31422:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35289:34:0;::::1;35281:93;;;;-1:-1:-1::0;;;35281:93:0::1;;;;;;;:::i;:::-;35385:19;:42:::0;;-1:-1:-1;;;;;;35385:42:0::1;-1:-1:-1::0;;;;;35385:42:0;;;::::1;::::0;;;::::1;::::0;;35187:248::o;8001:127::-;-1:-1:-1;;;;;8102:18:0;8075:7;8102:18;;;;;;;;;;;;8001:127::o;27429:103::-;27009:12;:10;:12::i;:::-;-1:-1:-1;;;;;26998:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26998:23:0;;26990:68;;;;-1:-1:-1;;;26990:68:0;;;;;;;:::i;:::-;27494:30:::1;27521:1;27494:18;:30::i;:::-;27429:103::o:0;30614:22::-;;;;:::o;36901:130::-;28749:9;;-1:-1:-1;;;;;28749:9:0;28762:10;28749:23;28741:72;;;;-1:-1:-1;;;28741:72:0;;;;;;;:::i;:::-;36992:31:::1;37007:7;37016:6;36992:14;:31::i;:::-;36901:130:::0;;:::o;30892:28::-;;;-1:-1:-1;;;30892:28:0;;;;;:::o;26778:87::-;26851:6;;-1:-1:-1;;;;;26851:6:0;26778:87;:::o;35939:240::-;36021:4;31568:12;:10;:12::i;:::-;:39;;;-1:-1:-1;31584:9:0;;-1:-1:-1;;;;;31584:9:0;31597:10;31584:23;31568:39;31560:96;;;;-1:-1:-1;;;31560:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36046:27:0;::::1;;::::0;;;:17:::1;:27;::::0;;;;;::::1;;36038:65;;;;-1:-1:-1::0;;;36038:65:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;36114:27:0::1;36144:5;36114:27:::0;;;:17:::1;:27;::::0;;;;:35;;-1:-1:-1;;36114:35:0::1;::::0;;-1:-1:-1;;35939:240:0:o;6929:104::-;6985:13;7018:7;7011:14;;;;;:::i;30302:41::-;;;-1:-1:-1;;;30302:41:0;;;;;:::o;33488:157::-;31430:9;;33568:4;;-1:-1:-1;;;;;31430:9:0;31443:10;31430:23;31422:64;;;;-1:-1:-1;;;31422:64:0;;;;;;;:::i;:::-;-1:-1:-1;33585:13:0::1;:30:::0;33633:4:::1;::::0;33488:157::o;11289:438::-;11382:4;11399:13;11415:12;:10;:12::i;:::-;-1:-1:-1;;;;;11465:18:0;;;11438:24;11465:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;11399:28;;-1:-1:-1;11511:35:0;;;;11503:85;;;;-1:-1:-1;;;11503:85:0;;;;;;;:::i;:::-;11624:60;11633:5;11640:7;11668:15;11649:16;:34;11624:8;:60::i;:::-;-1:-1:-1;11715:4:0;;11289:438;-1:-1:-1;;;;11289:438:0:o;32224:115::-;32311:13;:20;32224:115;:::o;8334:193::-;8413:4;8430:13;8446:12;:10;:12::i;:::-;8430:28;;8469;8479:5;8486:2;8490:6;8469:9;:28::i;33156:324::-;31430:9;;33241:4;;-1:-1:-1;;;;;31430:9:0;31443:10;31430:23;31422:64;;;;-1:-1:-1;;;31422:64:0;;;;;;;:::i;:::-;33339:23:::1;:21;:23::i;:::-;33330:6;:32;;;33322:87;;;;-1:-1:-1::0;;;33322:87:0::1;;;;;;;:::i;:::-;33444:6;33420:13;33434:6;33420:21;;;;;;;;-1:-1:-1::0;;;33420:21:0::1;;;;;;;;30790:34:::0;;;-1:-1:-1;;;;;30790:34:0;;:::o;35443:240::-;31430:9;;-1:-1:-1;;;;;31430:9:0;31443:10;31430:23;31422:64;;;;-1:-1:-1;;;31422:64:0;;;;;;;:::i;:::-;35522:16:::1;::::0;-1:-1:-1;;;35522:16:0;::::1;;;35521:17;35513:66;;;;-1:-1:-1::0;;;35513:66:0::1;;;;;;;:::i;:::-;35609:5;35598:8;:16;35590:56;;;;-1:-1:-1::0;;;35590:56:0::1;;;;;;;:::i;:::-;35657:7;:18:::0;35443:240::o;31253:49::-;;;;;;;;;;;;;;;:::o;8590:151::-;-1:-1:-1;;;;;8706:18:0;;;8679:7;8706:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8590:151::o;30049:69::-;30106:12;30049:69;:::o;32470:125::-;-1:-1:-1;;;;;32560:27:0;32536:4;32560:27;;;:17;:27;;;;;;;;;32470:125::o;32347:115::-;32434:13;:20;32347:115;:::o;34711:201::-;31568:12;:10;:12::i;:::-;:39;;;-1:-1:-1;31584:9:0;;-1:-1:-1;;;;;31584:9:0;31597:10;31584:23;31568:39;31560:96;;;;-1:-1:-1;;;31560:96:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34805:25:0;::::1;34797:72;;;;-1:-1:-1::0;;;34797:72:0::1;;;;;;;:::i;:::-;34880:10;:24:::0;;-1:-1:-1;;;;;;34880:24:0::1;-1:-1:-1::0;;;;;34880:24:0;;;::::1;::::0;;;::::1;::::0;;34711:201::o;27687:::-;27009:12;:10;:12::i;:::-;-1:-1:-1;;;;;26998:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26998:23:0;;26990:68;;;;-1:-1:-1;;;26990:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27776:22:0;::::1;27768:73;;;;-1:-1:-1::0;;;27768:73:0::1;;;;;;;:::i;:::-;27852:28;27871:8;27852:18;:28::i;34499:97::-:0;31430:9;;-1:-1:-1;;;;;31430:9:0;31443:10;31430:23;31422:64;;;;-1:-1:-1;;;31422:64:0;;;;;;;:::i;:::-;34565:16:::1;:23:::0;;-1:-1:-1;;;;34565:23:0::1;-1:-1:-1::0;;;34565:23:0::1;::::0;;34499:97::o;30166:72::-;30228:10;30166:72;:::o;4344:98::-;4424:10;4344:98;:::o;14925:380::-;-1:-1:-1;;;;;15061:19:0;;15053:68;;;;-1:-1:-1;;;15053:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15140:21:0;;15132:68;;;;-1:-1:-1;;;15132:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15213:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;15265:32;;;;;15243:6;;15265:32;:::i;:::-;;;;;;;;14925:380;;;:::o;33653:301::-;33744:10;;33736:48;;-1:-1:-1;;;33736:48:0;;33701:18;;-1:-1:-1;;;;;33744:10:0;;33736:27;;:48;;33772:4;;33779;;33736:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33736:48:0;;;;;;;;-1:-1:-1;;33736:48:0;;;;;;;;;;;;:::i;:::-;;;33732:215;;33881:54;;-1:-1:-1;;;33881:54:0;;;;;;;:::i;33732:215::-;-1:-1:-1;;;;;33832:15:0;;-1:-1:-1;33825:22:0;;33962:529;34047:16;;34024:7;;-1:-1:-1;;;34047:16:0;;;;34043:422;;;34085:12;34106:30;34134:1;34106:23;:21;:23::i;:30::-;34085:52;;34080:374;34199:13;34213:6;34199:21;;;;;;;;-1:-1:-1;;;34199:21:0;;;;;;;;;;;;;;;;;34185:10;:35;34181:258;;34277:5;34253:13;34267:6;34253:21;;;;;;;;-1:-1:-1;;;34253:21:0;;;;;;;;;;;;;;;;;:29;34245:69;;;;-1:-1:-1;;;34245:69:0;;;;;;;:::i;:::-;34347:13;34361:6;34347:21;;;;;;;;-1:-1:-1;;;34347:21:0;;;;;;;;;;;;;;;;;34337:7;:31;;;;34398:13;34412:6;34398:21;;;;;;;;-1:-1:-1;;;34398:21:0;;;;;;;;;;;;;;;;;34391:28;;;;;34181:258;34152:8;;;:::i;:::-;;;34080:374;;34043:422;-1:-1:-1;34482:1:0;33962:529;;;:::o;12206:671::-;-1:-1:-1;;;;;12337:18:0;;12329:68;;;;-1:-1:-1;;;12329:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12416:16:0;;12408:64;;;;-1:-1:-1;;;12408:64:0;;;;;;;:::i;:::-;12485:38;12506:4;12512:2;12516:6;12485:20;:38::i;:::-;-1:-1:-1;;;;;12558:15:0;;12536:19;12558:15;;;;;;;;;;;12592:21;;;;12584:72;;;;-1:-1:-1;;;12584:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12692:15:0;;;:9;:15;;;;;;;;;;;12710:20;;;12692:38;;12752:13;;;;;;;;:23;;12724:6;;12692:9;12752:23;;12724:6;;12752:23;:::i;:::-;;;;;;;;12808:2;-1:-1:-1;;;;;12793:26:0;12802:4;-1:-1:-1;;;;;12793:26:0;;12812:6;12793:26;;;;;;:::i;:::-;;;;;;;;12832:37;12852:4;12858:2;12862:6;12832:19;:37::i;37897:653::-;38049:4;38066:17;38086:30;38110:5;38086:19;38097:7;;38086:6;:10;;:19;;;;:::i;:::-;:23;;:30::i;:::-;38066:50;-1:-1:-1;38127:22:0;38152:21;:6;38066:50;38152:10;:21::i;:::-;38127:46;;38189:7;38186:225;;;38238:33;38253:6;38261:9;38238:14;:33::i;:::-;38186:225;;;38368:19;;38350:49;;38360:6;;-1:-1:-1;;;;;38368:19:0;38389:9;38350;:49::i;:::-;38474:44;38484:6;38492:9;38503:14;38474:9;:44::i;:::-;-1:-1:-1;38538:4:0;;37897:653;-1:-1:-1;;;;;;37897:653:0:o;23824:240::-;23944:7;24005:12;23997:6;;;;23989:29;;;;-1:-1:-1;;;23989:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;24040:5:0;;;23824:240::o;29072:257::-;-1:-1:-1;;;;;29149:26:0;;29141:84;;;;-1:-1:-1;;;29141:84:0;;;;;;;:::i;:::-;29241:45;;-1:-1:-1;;;;;29241:45:0;;;29269:1;;29241:45;;29269:1;;29241:45;29297:9;:24;;-1:-1:-1;;;;;;29297:24:0;-1:-1:-1;;;;;29297:24:0;;;;;;;;;;29072:257::o;13164:399::-;-1:-1:-1;;;;;13248:21:0;;13240:65;;;;-1:-1:-1;;;13240:65:0;;;;;;;:::i;:::-;13318:49;13347:1;13351:7;13360:6;13318:20;:49::i;:::-;13396:6;13380:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13413:18:0;;:9;:18;;;;;;;;;;:28;;13435:6;;13413:9;:28;;13435:6;;13413:28;:::i;:::-;;;;-1:-1:-1;;13457:37:0;;-1:-1:-1;;;;;13457:37:0;;;13474:1;;13457:37;;;;13487:6;;13457:37;:::i;:::-;;;;;;;;13507:48;13535:1;13539:7;13548:6;13507:19;:48::i;18094:91::-;18150:27;18156:12;:10;:12::i;:::-;18170:6;18150:5;:27::i;21926:98::-;21984:7;22011:5;22015:1;22011;:5;:::i;:::-;22004:12;21926:98;-1:-1:-1;;;21926:98:0:o;28048:191::-;28141:6;;;-1:-1:-1;;;;;28158:17:0;;;-1:-1:-1;;;;;;28158:17:0;;;;;;;28191:40;;28141:6;;;28158:17;28141:6;;28191:40;;28122:16;;28191:40;28048:191;;:::o;18504:164::-;18581:46;18597:7;18606:12;:10;:12::i;:::-;18620:6;18581:15;:46::i;:::-;18638:22;18644:7;18653:6;18638:5;:22::i;22283:98::-;22341:7;22368:5;22372:1;22368;:5;:::i;22682:98::-;22740:7;22767:5;22771:1;22767;:5;:::i;13896:591::-;-1:-1:-1;;;;;13980:21:0;;13972:67;;;;-1:-1:-1;;;13972:67:0;;;;;;;:::i;:::-;14052:49;14073:7;14090:1;14094:6;14052:20;:49::i;:::-;-1:-1:-1;;;;;14139:18:0;;14114:22;14139:18;;;;;;;;;;;14176:24;;;;14168:71;;;;-1:-1:-1;;;14168:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14275:18:0;;:9;:18;;;;;;;;;;14296:23;;;14275:44;;14341:12;:22;;14313:6;;14275:9;14341:22;;14313:6;;14341:22;:::i;:::-;;;;-1:-1:-1;;14381:37:0;;14407:1;;-1:-1:-1;;;;;14381:37:0;;;;;;;14411:6;;14381:37;:::i;:::-;;;;;;;;14431:48;14451:7;14468:1;14472:6;14431:19;:48::i;15592:453::-;15727:24;15754:25;15764:5;15771:7;15754:9;:25::i;:::-;15727:52;;-1:-1:-1;;15794:16:0;:37;15790:248;;15876:6;15856:16;:26;;15848:68;;;;-1:-1:-1;;;15848:68:0;;;;;;;:::i;:::-;15960:51;15969:5;15976:7;16004:6;15985:16;:25;15960:8;:51::i;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:402::-;;;407:2;395:9;386:7;382:23;378:32;375:2;;;428:6;420;413:22;375:2;472:9;459:23;491:33;518:5;491:33;:::i;:::-;543:5;-1:-1:-1;600:2:1;585:18;;572:32;613:35;572:32;613:35;:::i;:::-;667:7;657:17;;;365:315;;;;;:::o;685:545::-;;;;831:2;819:9;810:7;806:23;802:32;799:2;;;852:6;844;837:22;799:2;896:9;883:23;915:33;942:5;915:33;:::i;:::-;967:5;-1:-1:-1;1024:2:1;1009:18;;996:32;1037:35;996:32;1037:35;:::i;:::-;1091:7;-1:-1:-1;1150:2:1;1135:18;;1122:32;1163:35;1122:32;1163:35;:::i;:::-;1217:7;1207:17;;;789:441;;;;;:::o;1235:470::-;;;;1381:2;1369:9;1360:7;1356:23;1352:32;1349:2;;;1402:6;1394;1387:22;1349:2;1446:9;1433:23;1465:33;1492:5;1465:33;:::i;:::-;1517:5;-1:-1:-1;1574:2:1;1559:18;;1546:32;1587:35;1546:32;1587:35;:::i;:::-;1339:366;;1641:7;;-1:-1:-1;;;1695:2:1;1680:18;;;;1667:32;;1339:366::o;1710:327::-;;;1839:2;1827:9;1818:7;1814:23;1810:32;1807:2;;;1860:6;1852;1845:22;1807:2;1904:9;1891:23;1923:33;1950:5;1923:33;:::i;:::-;1975:5;2027:2;2012:18;;;;1999:32;;-1:-1:-1;;;1797:240:1:o;2042:297::-;;2162:2;2150:9;2141:7;2137:23;2133:32;2130:2;;;2183:6;2175;2168:22;2130:2;2220:9;2214:16;2273:5;2266:13;2259:21;2252:5;2249:32;2239:2;;2300:6;2292;2285:22;2344:483;;;;2503:2;2491:9;2482:7;2478:23;2474:32;2471:2;;;2524:6;2516;2509:22;2471:2;2568:9;2555:23;2587:33;2614:5;2587:33;:::i;:::-;2639:5;-1:-1:-1;2691:2:1;2676:18;;2663:32;;-1:-1:-1;2747:2:1;2732:18;;2719:32;2760:35;2719:32;2760:35;:::i;2832:329::-;;2955:2;2943:9;2934:7;2930:23;2926:32;2923:2;;;2976:6;2968;2961:22;2923:2;3013:9;3007:16;-1:-1:-1;;;;;3056:5:1;3052:50;3045:5;3042:61;3032:2;;3122:6;3114;3107:22;3166:190;;3278:2;3266:9;3257:7;3253:23;3249:32;3246:2;;;3299:6;3291;3284:22;3246:2;-1:-1:-1;3327:23:1;;3236:120;-1:-1:-1;3236:120:1:o;3361:357::-;;;3488:2;3476:9;3467:7;3463:23;3459:32;3456:2;;;3509:6;3501;3494:22;3456:2;3553:9;3540:23;3603:4;3596:5;3592:16;3585:5;3582:27;3572:2;;3628:6;3620;3613:22;3723:203;-1:-1:-1;;;;;3887:32:1;;;;3869:51;;3857:2;3842:18;;3824:102::o;3931:304::-;-1:-1:-1;;;;;4161:15:1;;;4143:34;;4213:15;;4208:2;4193:18;;4186:43;4093:2;4078:18;;4060:175::o;4240:300::-;-1:-1:-1;;;;;4458:32:1;;;;4440:51;;4522:2;4507:18;;4500:34;4428:2;4413:18;;4395:145::o;4824:187::-;4989:14;;4982:22;4964:41;;4952:2;4937:18;;4919:92::o;5016:603::-;;5157:2;5186;5175:9;5168:21;5218:6;5212:13;5261:6;5256:2;5245:9;5241:18;5234:34;5286:4;5299:140;5313:6;5310:1;5307:13;5299:140;;;5408:14;;;5404:23;;5398:30;5374:17;;;5393:2;5370:26;5363:66;5328:10;;5299:140;;;5457:6;5454:1;5451:13;5448:2;;;5527:4;5522:2;5513:6;5502:9;5498:22;5494:31;5487:45;5448:2;-1:-1:-1;5603:2:1;5582:15;-1:-1:-1;;5578:29:1;5563:45;;;;5610:2;5559:54;;5137:482;-1:-1:-1;;;5137:482:1:o;5624:334::-;5826:2;5808:21;;;5865:2;5845:18;;;5838:30;-1:-1:-1;;;5899:2:1;5884:18;;5877:40;5949:2;5934:18;;5798:160::o;5963:399::-;6165:2;6147:21;;;6204:2;6184:18;;;6177:30;6243:34;6238:2;6223:18;;6216:62;-1:-1:-1;;;6309:2:1;6294:18;;6287:33;6352:3;6337:19;;6137:225::o;6367:348::-;6569:2;6551:21;;;6608:2;6588:18;;;6581:30;6647:26;6642:2;6627:18;;6620:54;6706:2;6691:18;;6541:174::o;6720:351::-;6922:2;6904:21;;;6961:2;6941:18;;;6934:30;7000:29;6995:2;6980:18;;6973:57;7062:2;7047:18;;6894:177::o;7076:398::-;7278:2;7260:21;;;7317:2;7297:18;;;7290:30;7356:34;7351:2;7336:18;;7329:62;-1:-1:-1;;;7422:2:1;7407:18;;7400:32;7464:3;7449:19;;7250:224::o;7479:402::-;7681:2;7663:21;;;7720:2;7700:18;;;7693:30;7759:34;7754:2;7739:18;;7732:62;-1:-1:-1;;;7825:2:1;7810:18;;7803:36;7871:3;7856:19;;7653:228::o;7886:398::-;8088:2;8070:21;;;8127:2;8107:18;;;8100:30;8166:34;8161:2;8146:18;;8139:62;-1:-1:-1;;;8232:2:1;8217:18;;8210:32;8274:3;8259:19;;8060:224::o;8289:353::-;8491:2;8473:21;;;8530:2;8510:18;;;8503:30;8569:31;8564:2;8549:18;;8542:59;8633:2;8618:18;;8463:179::o;8647:402::-;8849:2;8831:21;;;8888:2;8868:18;;;8861:30;8927:34;8922:2;8907:18;;8900:62;-1:-1:-1;;;8993:2:1;8978:18;;8971:36;9039:3;9024:19;;8821:228::o;9054:349::-;9256:2;9238:21;;;9295:2;9275:18;;;9268:30;9334:27;9329:2;9314:18;;9307:55;9394:2;9379:18;;9228:175::o;9408:408::-;9610:2;9592:21;;;9649:2;9629:18;;;9622:30;9688:34;9683:2;9668:18;;9661:62;-1:-1:-1;;;9754:2:1;9739:18;;9732:42;9806:3;9791:19;;9582:234::o;9821:402::-;10023:2;10005:21;;;10062:2;10042:18;;;10035:30;10101:34;10096:2;10081:18;;10074:62;-1:-1:-1;;;10167:2:1;10152:18;;10145:36;10213:3;10198:19;;9995:228::o;10228:409::-;10430:2;10412:21;;;10469:2;10449:18;;;10442:30;10508:34;10503:2;10488:18;;10481:62;-1:-1:-1;;;10574:2:1;10559:18;;10552:43;10627:3;10612:19;;10402:235::o;10642:352::-;10844:2;10826:21;;;10883:2;10863:18;;;10856:30;10922;10917:2;10902:18;;10895:58;10985:2;10970:18;;10816:178::o;10999:356::-;11201:2;11183:21;;;11220:18;;;11213:30;11279:34;11274:2;11259:18;;11252:62;11346:2;11331:18;;11173:182::o;11360:410::-;11562:2;11544:21;;;11601:2;11581:18;;;11574:30;11640:34;11635:2;11620:18;;11613:62;-1:-1:-1;;;11706:2:1;11691:18;;11684:44;11760:3;11745:19;;11534:236::o;11775:400::-;11977:2;11959:21;;;12016:2;11996:18;;;11989:30;12055:34;12050:2;12035:18;;12028:62;-1:-1:-1;;;12121:2:1;12106:18;;12099:34;12165:3;12150:19;;11949:226::o;12180:339::-;12382:2;12364:21;;;12421:2;12401:18;;;12394:30;-1:-1:-1;;;12455:2:1;12440:18;;12433:45;12510:2;12495:18;;12354:165::o;12524:406::-;12726:2;12708:21;;;12765:2;12745:18;;;12738:30;12804:34;12799:2;12784:18;;12777:62;-1:-1:-1;;;12870:2:1;12855:18;;12848:40;12920:3;12905:19;;12698:232::o;12935:397::-;13137:2;13119:21;;;13176:2;13156:18;;;13149:30;13215:34;13210:2;13195:18;;13188:62;-1:-1:-1;;;13281:2:1;13266:18;;13259:31;13322:3;13307:19;;13109:223::o;13337:349::-;13539:2;13521:21;;;13578:2;13558:18;;;13551:30;13617:27;13612:2;13597:18;;13590:55;13677:2;13662:18;;13511:175::o;13691:398::-;13893:2;13875:21;;;13932:2;13912:18;;;13905:30;13971:34;13966:2;13951:18;;13944:62;-1:-1:-1;;;14037:2:1;14022:18;;14015:32;14079:3;14064:19;;13865:224::o;14094:400::-;14296:2;14278:21;;;14335:2;14315:18;;;14308:30;14374:34;14369:2;14354:18;;14347:62;-1:-1:-1;;;14440:2:1;14425:18;;14418:34;14484:3;14469:19;;14268:226::o;14499:401::-;14701:2;14683:21;;;14740:2;14720:18;;;14713:30;14779:34;14774:2;14759:18;;14752:62;-1:-1:-1;;;14845:2:1;14830:18;;14823:35;14890:3;14875:19;;14673:227::o;15263:408::-;15465:2;15447:21;;;15504:2;15484:18;;;15477:30;15543:34;15538:2;15523:18;;15516:62;-1:-1:-1;;;15609:2:1;15594:18;;15587:42;15661:3;15646:19;;15437:234::o;15676:400::-;15878:2;15860:21;;;15917:2;15897:18;;;15890:30;15956:34;15951:2;15936:18;;15929:62;-1:-1:-1;;;16022:2:1;16007:18;;16000:34;16066:3;16051:19;;15850:226::o;16081:337::-;16283:2;16265:21;;;16322:2;16302:18;;;16295:30;-1:-1:-1;;;16356:2:1;16341:18;;16334:43;16409:2;16394:18;;16255:163::o;16423:401::-;16625:2;16607:21;;;16664:2;16644:18;;;16637:30;16703:34;16698:2;16683:18;;16676:62;-1:-1:-1;;;16769:2:1;16754:18;;16747:35;16814:3;16799:19;;16597:227::o;16829:355::-;17031:2;17013:21;;;17070:2;17050:18;;;17043:30;17109:33;17104:2;17089:18;;17082:61;17175:2;17160:18;;17003:181::o;17189:177::-;17335:25;;;17323:2;17308:18;;17290:76::o;17371:184::-;17543:4;17531:17;;;;17513:36;;17501:2;17486:18;;17468:87::o;17560:128::-;;17631:1;17627:6;17624:1;17621:13;17618:2;;;17637:18;;:::i;:::-;-1:-1:-1;17673:9:1;;17608:80::o;17693:204::-;;17767:4;17764:1;17760:12;17799:4;17796:1;17792:12;17834:3;17828:4;17824:14;17819:3;17816:23;17813:2;;;17842:18;;:::i;:::-;17878:13;;17739:158;-1:-1:-1;;;17739:158:1:o;17902:217::-;;17968:1;17958:2;;-1:-1:-1;;;17993:31:1;;18047:4;18044:1;18037:15;18075:4;18000:1;18065:15;17958:2;-1:-1:-1;18104:9:1;;17948:171::o;18124:168::-;;18230:1;18226;18222:6;18218:14;18215:1;18212:21;18207:1;18200:9;18193:17;18189:45;18186:2;;;18237:18;;:::i;:::-;-1:-1:-1;18277:9:1;;18176:116::o;18297:125::-;;18365:1;18362;18359:8;18356:2;;;18370:18;;:::i;:::-;-1:-1:-1;18407:9:1;;18346:76::o;18427:195::-;;18502:4;18499:1;18495:12;18534:4;18531:1;18527:12;18559:3;18554;18551:12;18548:2;;;18566:18;;:::i;:::-;18603:13;;;18474:148;-1:-1:-1;;;18474:148:1:o;18627:178::-;;18708:4;18701:5;18697:16;18732:7;18722:2;;18743:18;;:::i;:::-;-1:-1:-1;;18779:20:1;;18672:133;-1:-1:-1;;18672:133:1:o;18810:380::-;18895:1;18885:12;;18942:1;18932:12;;;18953:2;;19007:4;18999:6;18995:17;18985:27;;18953:2;19060;19052:6;19049:14;19029:18;19026:38;19023:2;;;19106:10;19101:3;19097:20;19094:1;19087:31;19141:4;19138:1;19131:15;19169:4;19166:1;19159:15;19023:2;;18865:325;;;:::o;19195:127::-;19256:10;19251:3;19247:20;19244:1;19237:31;19287:4;19284:1;19277:15;19311:4;19308:1;19301:15;19327:133;-1:-1:-1;;;;;19404:31:1;;19394:42;;19384:2;;19450:1;19447;19440:12

Swarm Source

ipfs://0e1b63a77c29b6f8e9bada9a29529a715aa554b3af8441a7c8cd038d327fdd09
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.