ETH Price: $3,388.40 (+1.21%)

Token

Treat Token (TREAT)
 

Overview

Max Total Supply

4,180,623.3545138888888842 TREAT

Holders

535

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.918171296296296285 TREAT

Value
$0.00
0xC465A541e394Aea90F4DE78f9a2938A77E612B69
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
stakingTastiesNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-01
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

/*

*/



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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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);
}

// OpenZeppelin Contracts (last updated v4.7.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}.
 */
 // 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);
}
// 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;
    }
}

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, allowance(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 = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * 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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * 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 {}
}



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

// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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);
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

/*
                    __________   _____     ______       ____     __________
                   |___    ___| |     \   |   ___|     /    \   |___    ___|
                       |  |     |  |_| |  |  |___     /  /\  \      |  |
                       |  |     |     <   |   ___|   /  ___   \     |  | 
                       |  |     |  |\  \  |  |___   /  /    \  \    |  |
                       |__|     |__| \__\ |______| /__/      \__\   |__|

       _______   __________     ____        __    __    __________   ______   __      ______
     /  ______/ |___    ___|   /    \      |   | /  /  |___    ___| |      \ |  |   /   __   \
    |  /            |  |      /  /\  \     |   |/  /       |  |     |   __  \|  |  /  /    \__|
    |  \___         |  |     /  ___   \    |      <        |  |     |  |  \     | |  |     ____
     \_____  \      |  |    /  /    \  \   |   _   \       |  |     |  |   \    | |  |    |    |
    _______|  |     |  |   /  /      \  \  |  | \   \   ___|  |___  |  |    \   |  \  \ __ /  /
    \________/      |__|  /__/        \__\ |__|   \__\ |__________| |__|     \__|   \ ______ /



                            Contract provided By B.A.S.S Studios 
                            (Blockchain and Software Solutions)
*/

pragma solidity ^0.8.7;

//Tasties NFT Staking 

interface INFTContract {
    function balanceOf(address _user) external view returns (uint256);
  
}

contract stakingTastiesNFT is ERC20Burnable, Ownable {

    uint256 public constant NFT_BASE_RATE = 10000000000000000000; // 10 per Day
    address public constant NFT_ADDRESS = 0xd4d1f32c280056f107AD4ADf8e16BC02f2C5B339;//TastiesNFT Collection

    bool public stakingLive = false;
    bool public airdropToAll=true;
    bool public returnLock=false;

    mapping(uint256 => uint256) internal NftTokenIdTimeStaked;
    mapping(uint256 => address) internal NftTokenIdToStaker;
    mapping(address => uint256[]) internal stakerToNftTokenIds;
    //map token id to bool for if staked //fb
    mapping(uint256=>bool) public nftStaked;

    //trait type mapping token id to traid type   //fb
    //Trait types 1,2,3,4,5,6
    mapping(uint256 => uint256) private _traitType;

    //uint type multipliers to implement different payouts for different trait rarities (value must be 10x percentage desired)
    uint256 type1Multiplier=10;
    uint256 type2Multiplier=12;
    uint256 type3Multiplier=14;
    uint256 type4Multiplier=20;
    uint256 type5Multiplier=30;
    uint256 type6Multiplier=200;
    
    IERC721Enumerable private constant _NftIERC721 = IERC721Enumerable(NFT_ADDRESS);


    constructor() ERC20("Treat Token", "TREAT") {
    }

    function getTokenIDsStaked(address staker) public view returns (uint256[] memory) {
        return stakerToNftTokenIds[staker];
    }
    
    function getStakedCount(address staker) public view returns (uint256) {
        return stakerToNftTokenIds[staker].length;
    }

    function removeSpecificTokenIdFromArray(uint256[] storage array, uint256 tokenId) internal {
        uint256 length = array.length;
        for (uint256 i = 0; i < length; i++) {
            if (array[i] == tokenId) {
                length--;
                if (i < length) {
                    array[i] = array[length];
                }
                array.pop();
                break;
            }
        }
    }
// covers single staking and multiple
    function stakeNftsByTokenIds(uint256[] memory tokenIds) public  {
     require(stakingLive, "STAKING NOT LIVE");

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(_NftIERC721.ownerOf(id) == msg.sender && NftTokenIdToStaker[id] == address(0), "TOKEN NOT YOURS");
            //NFT transfer 
            _NftIERC721.transferFrom(msg.sender, address(this), id);
            //Track data
            stakerToNftTokenIds[msg.sender].push(id);
            NftTokenIdTimeStaked[id] = block.timestamp;
            NftTokenIdToStaker[id] = msg.sender;
            nftStaked[id]=true;
        }
       
    }
// unstake and claims for tokens

    function unstakeAll() public {
        require(getStakedCount(msg.sender) > 0, "Need at least 1 staked to unstake");
        uint256 totalRewards = 0;

        for (uint256 i = stakerToNftTokenIds[msg.sender].length; i > 0; i--) {
            uint256 tokenId = stakerToNftTokenIds[msg.sender][i - 1];

            _NftIERC721.transferFrom(address(this), msg.sender, tokenId);
            //add calculated value of the token id by its type //fb
            totalRewards += calculateRewardsByTokenId(tokenId);
            //pop used to save more gas and counting from end of the stored ids to index 0 //fb
            stakerToNftTokenIds[msg.sender].pop();
            NftTokenIdToStaker[tokenId] = address(0);
            nftStaked[tokenId]=false;
            //after gathering total rewards set token token id time staked to 0 //fb
            NftTokenIdTimeStaked[tokenId] = 0;
        }
        _mint(msg.sender, totalRewards);
    }

    function unstakeNftsByTokenIds(uint256[] memory tokenIds) public {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(NftTokenIdToStaker[id] == msg.sender, "NOT the staker");

            _NftIERC721.transferFrom(address(this), msg.sender, id);
             //add calculated value of the token id by its type //fb
            totalRewards += calculateRewardsByTokenId(id);
            //remove specific id from stored ids (less gas efficient than unstake all   //fb
            removeSpecificTokenIdFromArray(stakerToNftTokenIds[msg.sender], id);
            NftTokenIdToStaker[id] = address(0);
             nftStaked[id]=false;
             //after gathering total rewards set token id time staked to 0 //fb
            NftTokenIdTimeStaked[id] = 0;
        }

        _mint(msg.sender, totalRewards);
      
    }
    

    function claimTokensByTokenId(uint256 tokenId) public {
        require(NftTokenIdToStaker[tokenId] == msg.sender, "NOT the staker");
          //add calculated value of the token id by its type //fb
        _mint(msg.sender, (calculateRewardsByTokenId(tokenId)));
        NftTokenIdTimeStaked[tokenId] = block.timestamp;
    }
    
   
    function claimAllTokens() public {
        uint256 totalRewards = 0;

        uint256[] memory TokenIds = stakerToNftTokenIds[msg.sender];
        for (uint256 i = 0; i < TokenIds.length; i++) {
            uint256 id = TokenIds[i];
            require(NftTokenIdToStaker[id] == msg.sender, "NOT_STAKED_BY_YOU");
             //add calculated value of the token id by its type //fb
            totalRewards += calculateRewardsByTokenId(id);
            NftTokenIdTimeStaked[id] = block.timestamp;
        }
        
        
        _mint(msg.sender, totalRewards);
    }
//returning the total reward payout per address
    function getAllRewards(address staker) public view returns (uint256) {
        uint256 totalRewards = 0;
        uint256[] memory tokenIds = stakerToNftTokenIds[staker];
        for (uint256 i = 0; i < tokenIds.length; i++) {
             //add calculated value of the token id by its type //fb
            totalRewards += (calculateRewardsByTokenId(tokenIds[i]));
        } 
      

        return totalRewards;
    }

    function getRewardsByNftTokenId(uint256 tokenId) public view returns (uint256) {
        require(NftTokenIdToStaker[tokenId] != address(0), "TOKEN_NOT_STAKED");

          //add calculated value of the token id by its type //fb
        return calculateRewardsByTokenId(tokenId);
    }
    

    function getNftStaker(uint256 tokenId) public view returns (address) {
        return NftTokenIdToStaker[tokenId];
    }
    
    //return public is token id staked in contract
    function isStaked(uint256 tokenId) public view returns (bool) {
        return(nftStaked[tokenId]);
    }

    function toggle() external onlyOwner {
        stakingLive = !stakingLive;
    }

  //trait rarity list fuctions
  //set single token id type for multiplier fixes or possible future rewarding of specific tokens
  function setTypeList(uint256 tokenIdTemp, uint256 typeNumber) external onlyOwner {
       
            _traitType[tokenIdTemp] = typeNumber;
           
    }
  //set a full tokenId to type list can only map to one type at a time (maps all in list to the same trait number)
  function setFullTypeList(uint[] calldata idList, uint256 traitNum) external onlyOwner {
    for (uint256 i = 0; i < idList.length; i++) {
        _traitType[idList[i]] = traitNum;
    
    }
    
 }
//reward calculation multiplier applied before reaking down to a a daily value
  function calculateRewardsByTokenId(uint256 givenId) public view returns (uint256 _rewards){

       uint256 totalRewards = 0; 
       uint256 tempRewards=(block.timestamp -NftTokenIdTimeStaked[givenId]);
            if(_traitType[givenId]==1){
                tempRewards = (tempRewards* type1Multiplier)/10;
            }
             if(_traitType[givenId]==2){
                tempRewards = (tempRewards* type2Multiplier)/10;
            }
             if(_traitType[givenId]==3){
                tempRewards = (tempRewards* type3Multiplier)/10;
            }
             if(_traitType[givenId]==4){
                tempRewards = (tempRewards* type4Multiplier)/10;
            }
             if(_traitType[givenId]==5){
                tempRewards = (tempRewards* type5Multiplier)/10;
            }
                if(_traitType[givenId]==6){
                tempRewards = (tempRewards* type6Multiplier)/10;
            }
      totalRewards += ((tempRewards* NFT_BASE_RATE/86400));
      return(totalRewards);

  }
//return the trait type of the token id (returned value must be divided by 10 with 1 decimal place to get correct value)
 function getTypeByTokenId(uint256 givenId) public view returns (uint256 _rewards){

            if(_traitType[givenId]==1){
               return type1Multiplier;
            }
             if(_traitType[givenId]==2){
                return type2Multiplier;
            }
             if(_traitType[givenId]==3){
               return type3Multiplier;
            }
             if(_traitType[givenId]==4){
               return type4Multiplier;
            }
             if(_traitType[givenId]==5){
                return type5Multiplier;
            }
                if(_traitType[givenId]==6){
                return type6Multiplier;
            }

  }
//type multipliers access functions
    function setType1Multiplier(uint256 _newMultiplier) external onlyOwner{
        type1Multiplier=_newMultiplier;
    }
        function setType2Multiplier(uint256 _newMultiplier) external onlyOwner{
        type2Multiplier=_newMultiplier;
    }
        function setType3Multiplier(uint256 _newMultiplier) external onlyOwner{
        type3Multiplier=_newMultiplier;
    }
        function setType4Multiplier(uint256 _newMultiplier) external onlyOwner{
        type4Multiplier=_newMultiplier;
    }
        function setType5Multiplier(uint256 _newMultiplier) external onlyOwner{
        type5Multiplier=_newMultiplier;
    }
        function setType6Multiplier(uint256 _newMultiplier) external onlyOwner{
        type6Multiplier=_newMultiplier;
    }

//Return All Staked (emergency use to return all holders assets) use of this function may require redeployment
//NOTE this function does not remove token ids from the stakers array of staked tokens
//NOTE block time stamp is also not reset
//NOTE token id staker address not reset to address 0
//NOTE nft staked bool not reset to false
    function ReturnAllStakedNFTs() external payable onlyOwner{
    require(returnLock==true,"lock is on");
    uint256 currSupply=_NftIERC721.totalSupply();
        for(uint256 i=0;i<currSupply;i++){
            if(nftStaked[i]==true){
                 address sendAddress= NftTokenIdToStaker[i];
                _NftIERC721.transferFrom(address(this), sendAddress, i);
          
            }
        }
    }

//return lock change
    function returnLockToggle() public onlyOwner{
        returnLock=!returnLock;
    }
//only owner mint 
 function MintTokensOwner(address[] memory holders, uint256 amount) public onlyOwner {
  
        uint256 totalRewards=amount;
        for(uint256 i=0;i<holders.length;i++){
         _mint(holders[i], totalRewards);

        }
    }

//airdrop toggle
    function airdropToggle(bool choice)public onlyOwner{
        airdropToAll=choice;
    }
//airdrop to all holders
    function AirdropToHolders(uint256 tokenAmount) public payable onlyOwner{
        uint256 totalAmount= _NftIERC721.totalSupply();
        if(airdropToAll==true){
        for(uint256 j=0;j<totalAmount;j++){
            address ownerCurr =_NftIERC721.ownerOf(j);
            _mint(ownerCurr,tokenAmount);
        }
        }
        //airdrop to staked holders only
        if(airdropToAll==false){
        for(uint256 k=0; k<totalAmount;k++){
            if(nftStaked[k]==true){
                address ownerCurrent =_NftIERC721.ownerOf(k);
                _mint(ownerCurrent,tokenAmount);
            }
        }
        }
    }



}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"AirdropToHolders","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintTokensOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"NFT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_BASE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ReturnAllStakedNFTs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"airdropToAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"choice","type":"bool"}],"name":"airdropToggle","outputs":[],"stateMutability":"nonpayable","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":[{"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":[{"internalType":"uint256","name":"givenId","type":"uint256"}],"name":"calculateRewardsByTokenId","outputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimTokensByTokenId","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNftStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRewardsByNftTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTokenIDsStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"givenId","type":"uint256"}],"name":"getTypeByTokenId","outputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"returnLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"returnLockToggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"idList","type":"uint256[]"},{"internalType":"uint256","name":"traitNum","type":"uint256"}],"name":"setFullTypeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"setType1Multiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"setType2Multiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"setType3Multiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"setType4Multiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"setType5Multiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"setType6Multiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdTemp","type":"uint256"},{"internalType":"uint256","name":"typeNumber","type":"uint256"}],"name":"setTypeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeNftsByTokenIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeNftsByTokenIds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526005805462ffffff60a01b1916600160a81b179055600a600b55600c8055600e600d81905560149055601e600f5560c86010553480156200004457600080fd5b50604080518082018252600b81526a2a3932b0ba102a37b5b2b760a91b602080830191825283518085019094526005845264151491505560da1b908401528151919291620000959160039162000124565b508051620000ab90600490602084019062000124565b505050620000c8620000c2620000ce60201b60201c565b620000d2565b62000207565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013290620001ca565b90600052602060002090601f016020900481019282620001565760008555620001a1565b82601f106200017157805160ff1916838001178555620001a1565b82800160010185558215620001a1579182015b82811115620001a157825182559160200191906001019062000184565b50620001af929150620001b3565b5090565b5b80821115620001af5760008155600101620001b4565b600181811c90821680620001df57607f821691505b602082108114156200020157634e487b7160e01b600052602260045260246000fd5b50919050565b61288480620002176000396000f3fe6080604052600436106102ae5760003560e01c80637449612e11610175578063a9059cbb116100dc578063d2da25db11610095578063e8c12a591161006f578063e8c12a5914610894578063f09685ab146108b4578063f1e02f5e146108d4578063f2fde38b146108f057600080fd5b8063d2da25db14610833578063d92656a714610853578063dd62ed3e1461087457600080fd5b8063a9059cbb14610766578063b32c5c4514610786578063b58c774a146107ae578063b78204c8146107c3578063baa51f86146107e3578063cdcbd0c51461081357600080fd5b80638da5cb5b1161012e5780638da5cb5b146106b25780638db6ce75146106d0578063944e2ba9146106f057806395d89b4114610711578063a3a14b6014610726578063a457c2d71461074657600080fd5b80637449612e146105cf57806374fe3ae2146105fc578063759fcc4b1461061c57806379cc67901461063c57806383c13db21461065c57806386620a461461069257600080fd5b8063364062ed11610219578063482b4bfc116101d2578063482b4bfc1461051957806349f8f0af1461053957806351cc1115146105695780636add3d161461057157806370a0823114610584578063715018a6146105ba57600080fd5b8063364062ed14610436578063395093511461048457806340a3d246146104a45780634220e4b0146104b957806342966c68146104d95780634527a390146104f957600080fd5b806323b872dd1161026b57806323b872dd14610384578063279716a8146103a4578063300988d1146103c5578063313ce567146103e557806335322f3714610401578063362a3fad1461041657600080fd5b806306e650b6146102b357806306fdde03146102d5578063095ea7b31461030057806318160ddd146103305780631e4bd42c1461034f5780631f606fb714610364575b600080fd5b3480156102bf57600080fd5b506102d36102ce3660046125d0565b610910565b005b3480156102e157600080fd5b506102ea61092a565b6040516102f7919061265a565b60405180910390f35b34801561030c57600080fd5b5061032061031b366004612391565b6109bc565b60405190151581526020016102f7565b34801561033c57600080fd5b506002545b6040519081526020016102f7565b34801561035b57600080fd5b506102d36109d4565b34801561037057600080fd5b506102d361037f36600461259e565b610b06565b34801561039057600080fd5b5061032061039f366004612350565b610b13565b3480156103b057600080fd5b5060055461032090600160a81b900460ff1681565b3480156103d157600080fd5b506102d36103e03660046124e4565b610b37565b3480156103f157600080fd5b50604051601281526020016102f7565b34801561040d57600080fd5b506102d3610d7b565b34801561042257600080fd5b506103416104313660046122d6565b610f41565b34801561044257600080fd5b5061046c61045136600461259e565b6000908152600760205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016102f7565b34801561049057600080fd5b5061032061049f366004612391565b610fff565b3480156104b057600080fd5b506102d3611021565b3480156104c557600080fd5b506102d36104d436600461259e565b61104a565b3480156104e557600080fd5b506102d36104f436600461259e565b611057565b34801561050557600080fd5b506102d361051436600461259e565b611061565b34801561052557600080fd5b5061034161053436600461259e565b61106e565b34801561054557600080fd5b5061032061055436600461259e565b60096020526000908152604090205460ff1681565b6102d36111f8565b6102d361057f36600461259e565b611398565b34801561059057600080fd5b5061034161059f3660046122d6565b6001600160a01b031660009081526020819052604090205490565b3480156105c657600080fd5b506102d36115d6565b3480156105db57600080fd5b506105ef6105ea3660046122d6565b6115ea565b6040516102f79190612616565b34801561060857600080fd5b506102d3610617366004612469565b611656565b34801561062857600080fd5b506102d36106373660046124e4565b6116b2565b34801561064857600080fd5b506102d3610657366004612391565b611829565b34801561066857600080fd5b506103416106773660046122d6565b6001600160a01b031660009081526008602052604090205490565b34801561069e57600080fd5b506103416106ad36600461259e565b61183e565b3480156106be57600080fd5b506005546001600160a01b031661046c565b3480156106dc57600080fd5b506102d36106eb36600461259e565b6118fd565b3480156106fc57600080fd5b5060055461032090600160b01b900460ff1681565b34801561071d57600080fd5b506102ea61190a565b34801561073257600080fd5b506102d36107413660046123bd565b611919565b34801561075257600080fd5b50610320610761366004612391565b611963565b34801561077257600080fd5b50610320610781366004612391565b6119de565b34801561079257600080fd5b5061046c73d4d1f32c280056f107ad4adf8e16bc02f2c5b33981565b3480156107ba57600080fd5b506102d36119ec565b3480156107cf57600080fd5b506102d36107de36600461259e565b611a15565b3480156107ef57600080fd5b506103206107fe36600461259e565b60009081526009602052604090205460ff1690565b34801561081f57600080fd5b506102d361082e36600461259e565b611a91565b34801561083f57600080fd5b506102d361084e36600461259e565b611a9e565b34801561085f57600080fd5b5060055461032090600160a01b900460ff1681565b34801561088057600080fd5b5061034161088f366004612317565b611aab565b3480156108a057600080fd5b506103416108af36600461259e565b611ad6565b3480156108c057600080fd5b506102d36108cf36600461257c565b611b3c565b3480156108e057600080fd5b50610341678ac7230489e8000081565b3480156108fc57600080fd5b506102d361090b3660046122d6565b611b62565b610918611bd8565b6000918252600a602052604090912055565b6060600380546109399061278b565b80601f01602080910402602001604051908101604052809291908181526020018280546109659061278b565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b6000336109ca818585611c32565b5060019392505050565b33600090815260086020908152604080832080548251818502810185019093528083528493830182828015610a2857602002820191906000526020600020905b815481526020019060010190808311610a14575b5050505050905060005b8151811015610af7576000828281518110610a4f57610a4f61280d565b602090810291909101810151600081815260079092526040909120549091506001600160a01b03163314610abe5760405162461bcd60e51b81526020600482015260116024820152704e4f545f5354414b45445f42595f594f5560781b60448201526064015b60405180910390fd5b610ac78161106e565b610ad19085612704565b600091825260066020526040909120429055925080610aef816127c6565b915050610a32565b50610b023383611d56565b5050565b610b0e611bd8565b600b55565b600033610b21858285611e35565b610b2c858585611ea9565b506001949350505050565b600554600160a01b900460ff16610b835760405162461bcd60e51b815260206004820152601060248201526f5354414b494e47204e4f54204c49564560801b6044820152606401610ab5565b60005b8151811015610b02576000828281518110610ba357610ba361280d565b60209081029190910101516040516331a9108f60e11b815260048101829052909150339073d4d1f32c280056f107ad4adf8e16bc02f2c5b33990636352211e9060240160206040518083038186803b158015610bfe57600080fd5b505afa158015610c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3691906122fa565b6001600160a01b0316148015610c6157506000818152600760205260409020546001600160a01b0316155b610c9f5760405162461bcd60e51b815260206004820152600f60248201526e544f4b454e204e4f5420594f55525360881b6044820152606401610ab5565b6040516323b872dd60e01b815273d4d1f32c280056f107ad4adf8e16bc02f2c5b339906323b872dd90610cda903390309086906004016125f2565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b505033600081815260086020908152604080832080546001818101835591855283852001889055968352600682528083204290556007825280832080546001600160a01b0319169094179093556009905220805460ff191690931790925550819050610d73816127c6565b915050610b86565b3360009081526008602052604081205411610de25760405162461bcd60e51b815260206004820152602160248201527f4e656564206174206c656173742031207374616b656420746f20756e7374616b6044820152606560f81b6064820152608401610ab5565b336000908152600860205260408120545b8015610f3357336000908152600860205260408120610e1360018461275d565b81548110610e2357610e2361280d565b6000918252602090912001546040516323b872dd60e01b815290915073d4d1f32c280056f107ad4adf8e16bc02f2c5b339906323b872dd90610e6d903090339086906004016125f2565b600060405180830381600087803b158015610e8757600080fd5b505af1158015610e9b573d6000803e3d6000fd5b50505050610ea88161106e565b610eb29084612704565b33600090815260086020526040902080549194509080610ed457610ed46127f7565b60008281526020808220830160001990810183905590920190925591815260078252604080822080546001600160a01b031916905560098352808220805460ff1916905560069092529081205580610f2b81612774565b915050610df3565b50610f3e3382611d56565b50565b6001600160a01b0381166000908152600860209081526040808320805482518185028101850190935280835284938493929190830182828015610fa357602002820191906000526020600020905b815481526020019060010190808311610f8f575b5050505050905060005b8151811015610ff657610fd8828281518110610fcb57610fcb61280d565b602002602001015161106e565b610fe29084612704565b925080610fee816127c6565b915050610fad565b50909392505050565b6000336109ca8185856110128383611aab565b61101c9190612704565b611c32565b611029611bd8565b6005805460ff60a01b198116600160a01b9182900460ff1615909102179055565b611052611bd8565b600d55565b610f3e3382612077565b611069611bd8565b600c55565b6000818152600660205260408120548190819061108b904261275d565b6000858152600a6020526040902054909150600114156110c257600a600b54826110b5919061273e565b6110bf919061271c565b90505b6000848152600a6020526040902054600214156110f657600a600c54826110e9919061273e565b6110f3919061271c565b90505b6000848152600a60205260409020546003141561112a57600a600d548261111d919061273e565b611127919061271c565b90505b6000848152600a60205260409020546004141561115e57600a600e5482611151919061273e565b61115b919061271c565b90505b6000848152600a60205260409020546005141561119257600a600f5482611185919061273e565b61118f919061271c565b90505b6000848152600a6020526040902054600614156111c657600a601054826111b9919061273e565b6111c3919061271c565b90505b620151806111dc678ac7230489e800008361273e565b6111e6919061271c565b6111f09083612704565b949350505050565b611200611bd8565b600554600160b01b900460ff16151560011461124b5760405162461bcd60e51b815260206004820152600a6024820152693637b1b59034b99037b760b11b6044820152606401610ab5565b600073d4d1f32c280056f107ad4adf8e16bc02f2c5b3396001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d291906125b7565b905060005b81811015610b025760008181526009602052604090205460ff1615156001141561138657600081815260076020526040908190205490516323b872dd60e01b81526001600160a01b039091169073d4d1f32c280056f107ad4adf8e16bc02f2c5b339906323b872dd90611352903090859087906004016125f2565b600060405180830381600087803b15801561136c57600080fd5b505af1158015611380573d6000803e3d6000fd5b50505050505b80611390816127c6565b9150506112d7565b6113a0611bd8565b600073d4d1f32c280056f107ad4adf8e16bc02f2c5b3396001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ef57600080fd5b505afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142791906125b7565b600554909150600160a81b900460ff161515600114156114f35760005b818110156114f1576040516331a9108f60e11b81526004810182905260009073d4d1f32c280056f107ad4adf8e16bc02f2c5b33990636352211e9060240160206040518083038186803b15801561149a57600080fd5b505afa1580156114ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d291906122fa565b90506114de8185611d56565b50806114e9816127c6565b915050611444565b505b600554600160a81b900460ff16610b025760005b818110156115d15760008181526009602052604090205460ff161515600114156115bf576040516331a9108f60e11b81526004810182905260009073d4d1f32c280056f107ad4adf8e16bc02f2c5b33990636352211e9060240160206040518083038186803b15801561157957600080fd5b505afa15801561158d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b191906122fa565b90506115bd8185611d56565b505b806115c9816127c6565b915050611507565b505050565b6115de611bd8565b6115e860006121c5565b565b6001600160a01b03811660009081526008602090815260409182902080548351818402810184019094528084526060939283018282801561164a57602002820191906000526020600020905b815481526020019060010190808311611636575b50505050509050919050565b61165e611bd8565b60005b828110156116ac5781600a60008686858181106116805761168061280d565b9050602002013581526020019081526020016000208190555080806116a4906127c6565b915050611661565b50505050565b6000805b825181101561181e5760008382815181106116d3576116d361280d565b602090810291909101810151600081815260079092526040909120549091506001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152600e60248201526d2727aa103a34329039ba30b5b2b960911b6044820152606401610ab5565b6040516323b872dd60e01b815273d4d1f32c280056f107ad4adf8e16bc02f2c5b339906323b872dd90611775903090339086906004016125f2565b600060405180830381600087803b15801561178f57600080fd5b505af11580156117a3573d6000803e3d6000fd5b505050506117b08161106e565b6117ba9084612704565b3360009081526008602052604090209093506117d69082612217565b600090815260076020908152604080832080546001600160a01b031916905560098252808320805460ff19169055600690915281205580611816816127c6565b9150506116b6565b50610b023382611d56565b611834823383611e35565b610b028282612077565b6000818152600a60205260408120546001141561185d575050600b5490565b6000828152600a60205260409020546002141561187c575050600c5490565b6000828152600a60205260409020546003141561189b575050600d5490565b6000828152600a6020526040902054600414156118ba575050600e5490565b6000828152600a6020526040902054600514156118d9575050600f5490565b6000828152600a6020526040902054600614156118f857505060105490565b919050565b611905611bd8565b600f55565b6060600480546109399061278b565b611921611bd8565b8060005b83518110156116ac576119518482815181106119435761194361280d565b602002602001015183611d56565b8061195b816127c6565b915050611925565b600033816119718286611aab565b9050838110156119d15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ab5565b610b2c8286868403611c32565b6000336109ca818585611ea9565b6119f4611bd8565b6005805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6000818152600760205260409020546001600160a01b03163314611a6c5760405162461bcd60e51b815260206004820152600e60248201526d2727aa103a34329039ba30b5b2b960911b6044820152606401610ab5565b611a7e33611a798361106e565b611d56565b6000908152600660205260409020429055565b611a99611bd8565b600e55565b611aa6611bd8565b601055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000818152600760205260408120546001600160a01b0316611b2d5760405162461bcd60e51b815260206004820152601060248201526f1513d2d15397d393d517d4d51052d15160821b6044820152606401610ab5565b611b368261106e565b92915050565b611b44611bd8565b60058054911515600160a81b0260ff60a81b19909216919091179055565b611b6a611bd8565b6001600160a01b038116611bcf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab5565b610f3e816121c5565b6005546001600160a01b031633146115e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ab5565b6001600160a01b038316611c945760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab5565b6001600160a01b038216611cf55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ab5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216611dac5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ab5565b8060026000828254611dbe9190612704565b90915550506001600160a01b03821660009081526020819052604081208054839290611deb908490612704565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611e418484611aab565b905060001981146116ac5781811015611e9c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ab5565b6116ac8484848403611c32565b6001600160a01b038316611f0d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ab5565b6001600160a01b038216611f6f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ab5565b6001600160a01b03831660009081526020819052604090205481811015611fe75760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ab5565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061201e908490612704565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161206a91815260200190565b60405180910390a36116ac565b6001600160a01b0382166120d75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ab5565b6001600160a01b0382166000908152602081905260409020548181101561214b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ab5565b6001600160a01b038316600090815260208190526040812083830390556002805484929061217a90849061275d565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b815460005b818110156116ac57828482815481106122375761223761280d565b906000526020600020015414156122c4578161225281612774565b925050818110156122995783828154811061226f5761226f61280d565b906000526020600020015484828154811061228c5761228c61280d565b6000918252602090912001555b838054806122a9576122a96127f7565b600190038181906000526020600020016000905590556116ac565b806122ce816127c6565b91505061221c565b6000602082840312156122e857600080fd5b81356122f381612839565b9392505050565b60006020828403121561230c57600080fd5b81516122f381612839565b6000806040838503121561232a57600080fd5b823561233581612839565b9150602083013561234581612839565b809150509250929050565b60008060006060848603121561236557600080fd5b833561237081612839565b9250602084013561238081612839565b929592945050506040919091013590565b600080604083850312156123a457600080fd5b82356123af81612839565b946020939093013593505050565b600080604083850312156123d057600080fd5b823567ffffffffffffffff8111156123e757600080fd5b8301601f810185136123f857600080fd5b8035602061240d612408836126e0565b6126af565b80838252828201915082850189848660051b880101111561242d57600080fd5b600095505b8486101561245957803561244581612839565b835260019590950194918301918301612432565b5098969091013596505050505050565b60008060006040848603121561247e57600080fd5b833567ffffffffffffffff8082111561249657600080fd5b818601915086601f8301126124aa57600080fd5b8135818111156124b957600080fd5b8760208260051b85010111156124ce57600080fd5b6020928301989097509590910135949350505050565b600060208083850312156124f757600080fd5b823567ffffffffffffffff81111561250e57600080fd5b8301601f8101851361251f57600080fd5b803561252d612408826126e0565b80828252848201915084840188868560051b870101111561254d57600080fd5b600094505b83851015612570578035835260019490940193918501918501612552565b50979650505050505050565b60006020828403121561258e57600080fd5b813580151581146122f357600080fd5b6000602082840312156125b057600080fd5b5035919050565b6000602082840312156125c957600080fd5b5051919050565b600080604083850312156125e357600080fd5b50508035926020909101359150565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252825182820181905260009190848201906040850190845b8181101561264e57835183529284019291840191600101612632565b50909695505050505050565b600060208083528351808285015260005b818110156126875785810183015185820160400152820161266b565b81811115612699576000604083870101525b50601f01601f1916929092016040019392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156126d8576126d8612823565b604052919050565b600067ffffffffffffffff8211156126fa576126fa612823565b5060051b60200190565b60008219821115612717576127176127e1565b500190565b60008261273957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612758576127586127e1565b500290565b60008282101561276f5761276f6127e1565b500390565b600081612783576127836127e1565b506000190190565b600181811c9082168061279f57607f821691505b602082108114156127c057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127da576127da6127e1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f3e57600080fdfea264697066735822122091bfbc9b37d8f81f49336e8bdf06b382221d3466415e96df46879d1b25aa6bce64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80637449612e11610175578063a9059cbb116100dc578063d2da25db11610095578063e8c12a591161006f578063e8c12a5914610894578063f09685ab146108b4578063f1e02f5e146108d4578063f2fde38b146108f057600080fd5b8063d2da25db14610833578063d92656a714610853578063dd62ed3e1461087457600080fd5b8063a9059cbb14610766578063b32c5c4514610786578063b58c774a146107ae578063b78204c8146107c3578063baa51f86146107e3578063cdcbd0c51461081357600080fd5b80638da5cb5b1161012e5780638da5cb5b146106b25780638db6ce75146106d0578063944e2ba9146106f057806395d89b4114610711578063a3a14b6014610726578063a457c2d71461074657600080fd5b80637449612e146105cf57806374fe3ae2146105fc578063759fcc4b1461061c57806379cc67901461063c57806383c13db21461065c57806386620a461461069257600080fd5b8063364062ed11610219578063482b4bfc116101d2578063482b4bfc1461051957806349f8f0af1461053957806351cc1115146105695780636add3d161461057157806370a0823114610584578063715018a6146105ba57600080fd5b8063364062ed14610436578063395093511461048457806340a3d246146104a45780634220e4b0146104b957806342966c68146104d95780634527a390146104f957600080fd5b806323b872dd1161026b57806323b872dd14610384578063279716a8146103a4578063300988d1146103c5578063313ce567146103e557806335322f3714610401578063362a3fad1461041657600080fd5b806306e650b6146102b357806306fdde03146102d5578063095ea7b31461030057806318160ddd146103305780631e4bd42c1461034f5780631f606fb714610364575b600080fd5b3480156102bf57600080fd5b506102d36102ce3660046125d0565b610910565b005b3480156102e157600080fd5b506102ea61092a565b6040516102f7919061265a565b60405180910390f35b34801561030c57600080fd5b5061032061031b366004612391565b6109bc565b60405190151581526020016102f7565b34801561033c57600080fd5b506002545b6040519081526020016102f7565b34801561035b57600080fd5b506102d36109d4565b34801561037057600080fd5b506102d361037f36600461259e565b610b06565b34801561039057600080fd5b5061032061039f366004612350565b610b13565b3480156103b057600080fd5b5060055461032090600160a81b900460ff1681565b3480156103d157600080fd5b506102d36103e03660046124e4565b610b37565b3480156103f157600080fd5b50604051601281526020016102f7565b34801561040d57600080fd5b506102d3610d7b565b34801561042257600080fd5b506103416104313660046122d6565b610f41565b34801561044257600080fd5b5061046c61045136600461259e565b6000908152600760205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016102f7565b34801561049057600080fd5b5061032061049f366004612391565b610fff565b3480156104b057600080fd5b506102d3611021565b3480156104c557600080fd5b506102d36104d436600461259e565b61104a565b3480156104e557600080fd5b506102d36104f436600461259e565b611057565b34801561050557600080fd5b506102d361051436600461259e565b611061565b34801561052557600080fd5b5061034161053436600461259e565b61106e565b34801561054557600080fd5b5061032061055436600461259e565b60096020526000908152604090205460ff1681565b6102d36111f8565b6102d361057f36600461259e565b611398565b34801561059057600080fd5b5061034161059f3660046122d6565b6001600160a01b031660009081526020819052604090205490565b3480156105c657600080fd5b506102d36115d6565b3480156105db57600080fd5b506105ef6105ea3660046122d6565b6115ea565b6040516102f79190612616565b34801561060857600080fd5b506102d3610617366004612469565b611656565b34801561062857600080fd5b506102d36106373660046124e4565b6116b2565b34801561064857600080fd5b506102d3610657366004612391565b611829565b34801561066857600080fd5b506103416106773660046122d6565b6001600160a01b031660009081526008602052604090205490565b34801561069e57600080fd5b506103416106ad36600461259e565b61183e565b3480156106be57600080fd5b506005546001600160a01b031661046c565b3480156106dc57600080fd5b506102d36106eb36600461259e565b6118fd565b3480156106fc57600080fd5b5060055461032090600160b01b900460ff1681565b34801561071d57600080fd5b506102ea61190a565b34801561073257600080fd5b506102d36107413660046123bd565b611919565b34801561075257600080fd5b50610320610761366004612391565b611963565b34801561077257600080fd5b50610320610781366004612391565b6119de565b34801561079257600080fd5b5061046c73d4d1f32c280056f107ad4adf8e16bc02f2c5b33981565b3480156107ba57600080fd5b506102d36119ec565b3480156107cf57600080fd5b506102d36107de36600461259e565b611a15565b3480156107ef57600080fd5b506103206107fe36600461259e565b60009081526009602052604090205460ff1690565b34801561081f57600080fd5b506102d361082e36600461259e565b611a91565b34801561083f57600080fd5b506102d361084e36600461259e565b611a9e565b34801561085f57600080fd5b5060055461032090600160a01b900460ff1681565b34801561088057600080fd5b5061034161088f366004612317565b611aab565b3480156108a057600080fd5b506103416108af36600461259e565b611ad6565b3480156108c057600080fd5b506102d36108cf36600461257c565b611b3c565b3480156108e057600080fd5b50610341678ac7230489e8000081565b3480156108fc57600080fd5b506102d361090b3660046122d6565b611b62565b610918611bd8565b6000918252600a602052604090912055565b6060600380546109399061278b565b80601f01602080910402602001604051908101604052809291908181526020018280546109659061278b565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b6000336109ca818585611c32565b5060019392505050565b33600090815260086020908152604080832080548251818502810185019093528083528493830182828015610a2857602002820191906000526020600020905b815481526020019060010190808311610a14575b5050505050905060005b8151811015610af7576000828281518110610a4f57610a4f61280d565b602090810291909101810151600081815260079092526040909120549091506001600160a01b03163314610abe5760405162461bcd60e51b81526020600482015260116024820152704e4f545f5354414b45445f42595f594f5560781b60448201526064015b60405180910390fd5b610ac78161106e565b610ad19085612704565b600091825260066020526040909120429055925080610aef816127c6565b915050610a32565b50610b023383611d56565b5050565b610b0e611bd8565b600b55565b600033610b21858285611e35565b610b2c858585611ea9565b506001949350505050565b600554600160a01b900460ff16610b835760405162461bcd60e51b815260206004820152601060248201526f5354414b494e47204e4f54204c49564560801b6044820152606401610ab5565b60005b8151811015610b02576000828281518110610ba357610ba361280d565b60209081029190910101516040516331a9108f60e11b815260048101829052909150339073d4d1f32c280056f107ad4adf8e16bc02f2c5b33990636352211e9060240160206040518083038186803b158015610bfe57600080fd5b505afa158015610c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3691906122fa565b6001600160a01b0316148015610c6157506000818152600760205260409020546001600160a01b0316155b610c9f5760405162461bcd60e51b815260206004820152600f60248201526e544f4b454e204e4f5420594f55525360881b6044820152606401610ab5565b6040516323b872dd60e01b815273d4d1f32c280056f107ad4adf8e16bc02f2c5b339906323b872dd90610cda903390309086906004016125f2565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b505033600081815260086020908152604080832080546001818101835591855283852001889055968352600682528083204290556007825280832080546001600160a01b0319169094179093556009905220805460ff191690931790925550819050610d73816127c6565b915050610b86565b3360009081526008602052604081205411610de25760405162461bcd60e51b815260206004820152602160248201527f4e656564206174206c656173742031207374616b656420746f20756e7374616b6044820152606560f81b6064820152608401610ab5565b336000908152600860205260408120545b8015610f3357336000908152600860205260408120610e1360018461275d565b81548110610e2357610e2361280d565b6000918252602090912001546040516323b872dd60e01b815290915073d4d1f32c280056f107ad4adf8e16bc02f2c5b339906323b872dd90610e6d903090339086906004016125f2565b600060405180830381600087803b158015610e8757600080fd5b505af1158015610e9b573d6000803e3d6000fd5b50505050610ea88161106e565b610eb29084612704565b33600090815260086020526040902080549194509080610ed457610ed46127f7565b60008281526020808220830160001990810183905590920190925591815260078252604080822080546001600160a01b031916905560098352808220805460ff1916905560069092529081205580610f2b81612774565b915050610df3565b50610f3e3382611d56565b50565b6001600160a01b0381166000908152600860209081526040808320805482518185028101850190935280835284938493929190830182828015610fa357602002820191906000526020600020905b815481526020019060010190808311610f8f575b5050505050905060005b8151811015610ff657610fd8828281518110610fcb57610fcb61280d565b602002602001015161106e565b610fe29084612704565b925080610fee816127c6565b915050610fad565b50909392505050565b6000336109ca8185856110128383611aab565b61101c9190612704565b611c32565b611029611bd8565b6005805460ff60a01b198116600160a01b9182900460ff1615909102179055565b611052611bd8565b600d55565b610f3e3382612077565b611069611bd8565b600c55565b6000818152600660205260408120548190819061108b904261275d565b6000858152600a6020526040902054909150600114156110c257600a600b54826110b5919061273e565b6110bf919061271c565b90505b6000848152600a6020526040902054600214156110f657600a600c54826110e9919061273e565b6110f3919061271c565b90505b6000848152600a60205260409020546003141561112a57600a600d548261111d919061273e565b611127919061271c565b90505b6000848152600a60205260409020546004141561115e57600a600e5482611151919061273e565b61115b919061271c565b90505b6000848152600a60205260409020546005141561119257600a600f5482611185919061273e565b61118f919061271c565b90505b6000848152600a6020526040902054600614156111c657600a601054826111b9919061273e565b6111c3919061271c565b90505b620151806111dc678ac7230489e800008361273e565b6111e6919061271c565b6111f09083612704565b949350505050565b611200611bd8565b600554600160b01b900460ff16151560011461124b5760405162461bcd60e51b815260206004820152600a6024820152693637b1b59034b99037b760b11b6044820152606401610ab5565b600073d4d1f32c280056f107ad4adf8e16bc02f2c5b3396001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561129a57600080fd5b505afa1580156112ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d291906125b7565b905060005b81811015610b025760008181526009602052604090205460ff1615156001141561138657600081815260076020526040908190205490516323b872dd60e01b81526001600160a01b039091169073d4d1f32c280056f107ad4adf8e16bc02f2c5b339906323b872dd90611352903090859087906004016125f2565b600060405180830381600087803b15801561136c57600080fd5b505af1158015611380573d6000803e3d6000fd5b50505050505b80611390816127c6565b9150506112d7565b6113a0611bd8565b600073d4d1f32c280056f107ad4adf8e16bc02f2c5b3396001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ef57600080fd5b505afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142791906125b7565b600554909150600160a81b900460ff161515600114156114f35760005b818110156114f1576040516331a9108f60e11b81526004810182905260009073d4d1f32c280056f107ad4adf8e16bc02f2c5b33990636352211e9060240160206040518083038186803b15801561149a57600080fd5b505afa1580156114ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d291906122fa565b90506114de8185611d56565b50806114e9816127c6565b915050611444565b505b600554600160a81b900460ff16610b025760005b818110156115d15760008181526009602052604090205460ff161515600114156115bf576040516331a9108f60e11b81526004810182905260009073d4d1f32c280056f107ad4adf8e16bc02f2c5b33990636352211e9060240160206040518083038186803b15801561157957600080fd5b505afa15801561158d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b191906122fa565b90506115bd8185611d56565b505b806115c9816127c6565b915050611507565b505050565b6115de611bd8565b6115e860006121c5565b565b6001600160a01b03811660009081526008602090815260409182902080548351818402810184019094528084526060939283018282801561164a57602002820191906000526020600020905b815481526020019060010190808311611636575b50505050509050919050565b61165e611bd8565b60005b828110156116ac5781600a60008686858181106116805761168061280d565b9050602002013581526020019081526020016000208190555080806116a4906127c6565b915050611661565b50505050565b6000805b825181101561181e5760008382815181106116d3576116d361280d565b602090810291909101810151600081815260079092526040909120549091506001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152600e60248201526d2727aa103a34329039ba30b5b2b960911b6044820152606401610ab5565b6040516323b872dd60e01b815273d4d1f32c280056f107ad4adf8e16bc02f2c5b339906323b872dd90611775903090339086906004016125f2565b600060405180830381600087803b15801561178f57600080fd5b505af11580156117a3573d6000803e3d6000fd5b505050506117b08161106e565b6117ba9084612704565b3360009081526008602052604090209093506117d69082612217565b600090815260076020908152604080832080546001600160a01b031916905560098252808320805460ff19169055600690915281205580611816816127c6565b9150506116b6565b50610b023382611d56565b611834823383611e35565b610b028282612077565b6000818152600a60205260408120546001141561185d575050600b5490565b6000828152600a60205260409020546002141561187c575050600c5490565b6000828152600a60205260409020546003141561189b575050600d5490565b6000828152600a6020526040902054600414156118ba575050600e5490565b6000828152600a6020526040902054600514156118d9575050600f5490565b6000828152600a6020526040902054600614156118f857505060105490565b919050565b611905611bd8565b600f55565b6060600480546109399061278b565b611921611bd8565b8060005b83518110156116ac576119518482815181106119435761194361280d565b602002602001015183611d56565b8061195b816127c6565b915050611925565b600033816119718286611aab565b9050838110156119d15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ab5565b610b2c8286868403611c32565b6000336109ca818585611ea9565b6119f4611bd8565b6005805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6000818152600760205260409020546001600160a01b03163314611a6c5760405162461bcd60e51b815260206004820152600e60248201526d2727aa103a34329039ba30b5b2b960911b6044820152606401610ab5565b611a7e33611a798361106e565b611d56565b6000908152600660205260409020429055565b611a99611bd8565b600e55565b611aa6611bd8565b601055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000818152600760205260408120546001600160a01b0316611b2d5760405162461bcd60e51b815260206004820152601060248201526f1513d2d15397d393d517d4d51052d15160821b6044820152606401610ab5565b611b368261106e565b92915050565b611b44611bd8565b60058054911515600160a81b0260ff60a81b19909216919091179055565b611b6a611bd8565b6001600160a01b038116611bcf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ab5565b610f3e816121c5565b6005546001600160a01b031633146115e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ab5565b6001600160a01b038316611c945760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ab5565b6001600160a01b038216611cf55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ab5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216611dac5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ab5565b8060026000828254611dbe9190612704565b90915550506001600160a01b03821660009081526020819052604081208054839290611deb908490612704565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611e418484611aab565b905060001981146116ac5781811015611e9c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ab5565b6116ac8484848403611c32565b6001600160a01b038316611f0d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ab5565b6001600160a01b038216611f6f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ab5565b6001600160a01b03831660009081526020819052604090205481811015611fe75760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ab5565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061201e908490612704565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161206a91815260200190565b60405180910390a36116ac565b6001600160a01b0382166120d75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ab5565b6001600160a01b0382166000908152602081905260409020548181101561214b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610ab5565b6001600160a01b038316600090815260208190526040812083830390556002805484929061217a90849061275d565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b815460005b818110156116ac57828482815481106122375761223761280d565b906000526020600020015414156122c4578161225281612774565b925050818110156122995783828154811061226f5761226f61280d565b906000526020600020015484828154811061228c5761228c61280d565b6000918252602090912001555b838054806122a9576122a96127f7565b600190038181906000526020600020016000905590556116ac565b806122ce816127c6565b91505061221c565b6000602082840312156122e857600080fd5b81356122f381612839565b9392505050565b60006020828403121561230c57600080fd5b81516122f381612839565b6000806040838503121561232a57600080fd5b823561233581612839565b9150602083013561234581612839565b809150509250929050565b60008060006060848603121561236557600080fd5b833561237081612839565b9250602084013561238081612839565b929592945050506040919091013590565b600080604083850312156123a457600080fd5b82356123af81612839565b946020939093013593505050565b600080604083850312156123d057600080fd5b823567ffffffffffffffff8111156123e757600080fd5b8301601f810185136123f857600080fd5b8035602061240d612408836126e0565b6126af565b80838252828201915082850189848660051b880101111561242d57600080fd5b600095505b8486101561245957803561244581612839565b835260019590950194918301918301612432565b5098969091013596505050505050565b60008060006040848603121561247e57600080fd5b833567ffffffffffffffff8082111561249657600080fd5b818601915086601f8301126124aa57600080fd5b8135818111156124b957600080fd5b8760208260051b85010111156124ce57600080fd5b6020928301989097509590910135949350505050565b600060208083850312156124f757600080fd5b823567ffffffffffffffff81111561250e57600080fd5b8301601f8101851361251f57600080fd5b803561252d612408826126e0565b80828252848201915084840188868560051b870101111561254d57600080fd5b600094505b83851015612570578035835260019490940193918501918501612552565b50979650505050505050565b60006020828403121561258e57600080fd5b813580151581146122f357600080fd5b6000602082840312156125b057600080fd5b5035919050565b6000602082840312156125c957600080fd5b5051919050565b600080604083850312156125e357600080fd5b50508035926020909101359150565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020808252825182820181905260009190848201906040850190845b8181101561264e57835183529284019291840191600101612632565b50909695505050505050565b600060208083528351808285015260005b818110156126875785810183015185820160400152820161266b565b81811115612699576000604083870101525b50601f01601f1916929092016040019392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156126d8576126d8612823565b604052919050565b600067ffffffffffffffff8211156126fa576126fa612823565b5060051b60200190565b60008219821115612717576127176127e1565b500190565b60008261273957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612758576127586127e1565b500290565b60008282101561276f5761276f6127e1565b500390565b600081612783576127836127e1565b506000190190565b600181811c9082168061279f57607f821691505b602082108114156127c057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127da576127da6127e1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f3e57600080fdfea264697066735822122091bfbc9b37d8f81f49336e8bdf06b382221d3466415e96df46879d1b25aa6bce64736f6c63430008070033

Deployed Bytecode Sourcemap

29078:12083:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35997:162;;;;;;;;;;-1:-1:-1;35997:162:0;;;;;:::i;:::-;;:::i;:::-;;6469:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8820:201;;;;;;;;;;-1:-1:-1;8820:201:0;;;;;:::i;:::-;;:::i;:::-;;;6644:14:1;;6637:22;6619:41;;6607:2;6592:18;8820:201:0;6479:187:1;7589:108:0;;;;;;;;;;-1:-1:-1;7677:12:0;;7589:108;;;14605:25:1;;;14593:2;14578:18;7589:108:0;14459:177:1;34098:585:0;;;;;;;;;;;;;:::i;38456:119::-;;;;;;;;;;-1:-1:-1;38456:119:0;;;;;:::i;:::-;;:::i;9601:295::-;;;;;;;;;;-1:-1:-1;9601:295:0;;;;;:::i;:::-;;:::i;29371:29::-;;;;;;;;;;-1:-1:-1;29371:29:0;;;;-1:-1:-1;;;29371:29:0;;;;;;31120:678;;;;;;;;;;-1:-1:-1;31120:678:0;;;;;:::i;:::-;;:::i;7431:93::-;;;;;;;;;;-1:-1:-1;7431:93:0;;7514:2;14783:36:1;;14771:2;14756:18;7431:93:0;14641:184:1;31840:953:0;;;;;;;;;;;;;:::i;34738:428::-;;;;;;;;;;-1:-1:-1;34738:428:0;;;;;:::i;:::-;;:::i;35477:122::-;;;;;;;;;;-1:-1:-1;35477:122:0;;;;;:::i;:::-;35537:7;35564:27;;;:18;:27;;;;;;-1:-1:-1;;;;;35564:27:0;;35477:122;;;;-1:-1:-1;;;;;5418:32:1;;;5400:51;;5388:2;5373:18;35477:122:0;5254:203:1;10305:238:0;;;;;;;;;;-1:-1:-1;10305:238:0;;;;;:::i;:::-;;:::i;35778:82::-;;;;;;;;;;;;;:::i;38714:119::-;;;;;;;;;;-1:-1:-1;38714:119:0;;;;;:::i;:::-;;:::i;17761:91::-;;;;;;;;;;-1:-1:-1;17761:91:0;;;;;:::i;:::-;;:::i;38585:119::-;;;;;;;;;;-1:-1:-1;38585:119:0;;;;;:::i;:::-;;:::i;36567:1043::-;;;;;;;;;;-1:-1:-1;36567:1043:0;;;;;:::i;:::-;;:::i;29682:39::-;;;;;;;;;;-1:-1:-1;29682:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39569:416;;;:::i;40508:644::-;;;;;;:::i;:::-;;:::i;7760:127::-;;;;;;;;;;-1:-1:-1;7760:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;7861:18:0;7834:7;7861:18;;;;;;;;;;;;7760:127;20170:103;;;;;;;;;;;;;:::i;30355:135::-;;;;;;;;;;-1:-1:-1;30355:135:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36279:204::-;;;;;;;;;;-1:-1:-1;36279:204:0;;;;;:::i;:::-;;:::i;32801:934::-;;;;;;;;;;-1:-1:-1;32801:934:0;;;;;:::i;:::-;;:::i;18171:164::-;;;;;;;;;;-1:-1:-1;18171:164:0;;;;;:::i;:::-;;:::i;30502:130::-;;;;;;;;;;-1:-1:-1;30502:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;30590:27:0;30563:7;30590:27;;;:19;:27;;;;;:34;;30502:130;37735:678;;;;;;;;;;-1:-1:-1;37735:678:0;;;;;:::i;:::-;;:::i;19522:87::-;;;;;;;;;;-1:-1:-1;19595:6:0;;-1:-1:-1;;;;;19595:6:0;19522:87;;38972:119;;;;;;;;;;-1:-1:-1;38972:119:0;;;;;:::i;:::-;;:::i;29407:28::-;;;;;;;;;;-1:-1:-1;29407:28:0;;;;-1:-1:-1;;;29407:28:0;;;;;;6688:104;;;;;;;;;;;;;:::i;40123:238::-;;;;;;;;;;-1:-1:-1;40123:238:0;;;;;:::i;:::-;;:::i;11046:436::-;;;;;;;;;;-1:-1:-1;11046:436:0;;;;;:::i;:::-;;:::i;8093:193::-;;;;;;;;;;-1:-1:-1;8093:193:0;;;;;:::i;:::-;;:::i;29221:80::-;;;;;;;;;;;;29259:42;29221:80;;40015:85;;;;;;;;;;;;;:::i;33749:332::-;;;;;;;;;;-1:-1:-1;33749:332:0;;;;;:::i;:::-;;:::i;35663:107::-;;;;;;;;;;-1:-1:-1;35663:107:0;;;;;:::i;:::-;35719:4;35743:18;;;:9;:18;;;;;;;;;35663:107;38843:119;;;;;;;;;;-1:-1:-1;38843:119:0;;;;;:::i;:::-;;:::i;39101:::-;;;;;;;;;;-1:-1:-1;39101:119:0;;;;;:::i;:::-;;:::i;29333:31::-;;;;;;;;;;-1:-1:-1;29333:31:0;;;;-1:-1:-1;;;29333:31:0;;;;;;8349:151;;;;;;;;;;-1:-1:-1;8349:151:0;;;;;:::i;:::-;;:::i;35174:289::-;;;;;;;;;;-1:-1:-1;35174:289:0;;;;;:::i;:::-;;:::i;40387:89::-;;;;;;;;;;-1:-1:-1;40387:89:0;;;;;:::i;:::-;;:::i;29140:60::-;;;;;;;;;;;;29180:20;29140:60;;20428:201;;;;;;;;;;-1:-1:-1;20428:201:0;;;;;:::i;:::-;;:::i;35997:162::-;19408:13;:11;:13::i;:::-;36102:23:::1;::::0;;;:10:::1;:23;::::0;;;;;:36;35997:162::o;6469:100::-;6523:13;6556:5;6549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6469:100;:::o;8820:201::-;8903:4;5555:10;8959:32;5555:10;8975:7;8984:6;8959:8;:32::i;:::-;-1:-1:-1;9009:4:0;;8820:201;-1:-1:-1;;;8820:201:0:o;34098:585::-;34227:10;34142:20;34207:31;;;:19;:31;;;;;;;;34179:59;;;;;;;;;;;;;;;;;34142:20;;34179:59;;34207:31;34179:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34254:9;34249:365;34273:8;:15;34269:1;:19;34249:365;;;34310:10;34323:8;34332:1;34323:11;;;;;;;;:::i;:::-;;;;;;;;;;;;34357:22;;;;:18;:22;;;;;;;;34323:11;;-1:-1:-1;;;;;;34357:22:0;34383:10;34357:36;34349:66;;;;-1:-1:-1;;;34349:66:0;;8282:2:1;34349:66:0;;;8264:21:1;8321:2;8301:18;;;8294:30;-1:-1:-1;;;8340:18:1;;;8333:47;8397:18;;34349:66:0;;;;;;;;;34516:29;34542:2;34516:25;:29::i;:::-;34500:45;;;;:::i;:::-;34560:24;;;;:20;:24;;;;;;34587:15;34560:42;;34500:45;-1:-1:-1;34290:3:0;;;;:::i;:::-;;;;34249:365;;;;34644:31;34650:10;34662:12;34644:5;:31::i;:::-;34131:552;;34098:585::o;38456:119::-;19408:13;:11;:13::i;:::-;38537:15:::1;:30:::0;38456:119::o;9601:295::-;9732:4;5555:10;9790:38;9806:4;5555:10;9821:6;9790:15;:38::i;:::-;9839:27;9849:4;9855:2;9859:6;9839:9;:27::i;:::-;-1:-1:-1;9884:4:0;;9601:295;-1:-1:-1;;;;9601:295:0:o;31120:678::-;31200:11;;-1:-1:-1;;;31200:11:0;;;;31192:40;;;;-1:-1:-1;;;31192:40:0;;11231:2:1;31192:40:0;;;11213:21:1;11270:2;11250:18;;;11243:30;-1:-1:-1;;;11289:18:1;;;11282:46;11345:18;;31192:40:0;11029:340:1;31192:40:0;31250:9;31245:537;31269:8;:15;31265:1;:19;31245:537;;;31306:10;31319:8;31328:1;31319:11;;;;;;;;:::i;:::-;;;;;;;;;;;31353:23;;-1:-1:-1;;;31353:23:0;;;;;14605:25:1;;;31319:11:0;;-1:-1:-1;31380:10:0;;29259:42;;31353:19;;14578:18:1;;31353:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31353:37:0;;:77;;;;-1:-1:-1;31428:1:0;31394:22;;;:18;:22;;;;;;-1:-1:-1;;;;;31394:22:0;:36;31353:77;31345:105;;;;-1:-1:-1;;;31345:105:0;;8628:2:1;31345:105:0;;;8610:21:1;8667:2;8647:18;;;8640:30;-1:-1:-1;;;8686:18:1;;;8679:45;8741:18;;31345:105:0;8426:339:1;31345:105:0;31494:55;;-1:-1:-1;;;31494:55:0;;29259:42;;31494:24;;:55;;31519:10;;31539:4;;31546:2;;31494:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31610:10:0;31590:31;;;;:19;:31;;;;;;;;:40;;;;;;;;;;;;;;;;;;31645:24;;;:20;:24;;;;;31672:15;31645:42;;31702:18;:22;;;;;:35;;-1:-1:-1;;;;;;31702:35:0;;;;;;;31752:9;:13;;;:18;;-1:-1:-1;;31752:18:0;;;;;;;-1:-1:-1;31286:3:0;;-1:-1:-1;31286:3:0;;;:::i;:::-;;;;31245:537;;31840:953;31903:10;31917:1;30590:27;;;:19;:27;;;;;:34;31888:30;31880:76;;;;-1:-1:-1;;;31880:76:0;;11937:2:1;31880:76:0;;;11919:21:1;11976:2;11956:18;;;11949:30;12015:34;11995:18;;;11988:62;-1:-1:-1;;;12066:18:1;;;12059:31;12107:19;;31880:76:0;11735:397:1;31880:76:0;32041:10;31967:20;32021:31;;;:19;:31;;;;;:38;32004:740;32061:5;;32004:740;;32126:10;32088:15;32106:31;;;:19;:31;;;;;32138:5;32142:1;32138;:5;:::i;:::-;32106:38;;;;;;;;:::i;:::-;;;;;;;;;;;32161:60;;-1:-1:-1;;;32161:60:0;;32106:38;;-1:-1:-1;29259:42:0;;32161:24;;:60;;32194:4;;32201:10;;32106:38;;32161:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32321:34;32347:7;32321:25;:34::i;:::-;32305:50;;;;:::i;:::-;32487:10;32467:31;;;;:19;:31;;;;;:37;;32305:50;;-1:-1:-1;32467:31:0;:37;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;32467:37:0;;;;;;;;;;;;32519:27;;;:18;:27;;;;;;:40;;-1:-1:-1;;;;;;32519:40:0;;;32574:9;:18;;;;;:24;;-1:-1:-1;;32574:24:0;;;32699:20;:29;;;;;;:33;32068:3;;;;:::i;:::-;;;;32004:740;;;;32754:31;32760:10;32772:12;32754:5;:31::i;:::-;31869:924;31840:953::o;34738:428::-;-1:-1:-1;;;;;34881:27:0;;34798:7;34881:27;;;:19;:27;;;;;;;;34853:55;;;;;;;;;;;;;;;;;34798:7;;;;34853:55;34881:27;34853:55;;;34881:27;34853:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34924:9;34919:199;34943:8;:15;34939:1;:19;34919:199;;;35067:38;35093:8;35102:1;35093:11;;;;;;;;:::i;:::-;;;;;;;35067:25;:38::i;:::-;35050:56;;;;:::i;:::-;;-1:-1:-1;34960:3:0;;;;:::i;:::-;;;;34919:199;;;-1:-1:-1;35146:12:0;;34738:428;-1:-1:-1;;;34738:428:0:o;10305:238::-;10393:4;5555:10;10449:64;5555:10;10465:7;10502:10;10474:25;5555:10;10465:7;10474:9;:25::i;:::-;:38;;;;:::i;:::-;10449:8;:64::i;35778:82::-;19408:13;:11;:13::i;:::-;35841:11:::1;::::0;;-1:-1:-1;;;;35826:26:0;::::1;-1:-1:-1::0;;;35841:11:0;;;::::1;;;35840:12;35826:26:::0;;::::1;;::::0;;35778:82::o;38714:119::-;19408:13;:11;:13::i;:::-;38795:15:::1;:30:::0;38714:119::o;17761:91::-;17817:27;5555:10;17837:6;17817:5;:27::i;38585:119::-;19408:13;:11;:13::i;:::-;38666:15:::1;:30:::0;38585:119::o;36567:1043::-;36640:16;36742:29;;;:20;:29;;;;;;36640:16;;;;36725:46;;:15;:46;:::i;:::-;36790:19;;;;:10;:19;;;;;;36704:68;;-1:-1:-1;36811:1:0;36790:22;36787:108;;;36877:2;36860:15;;36847:11;:28;;;;:::i;:::-;36846:33;;;;:::i;:::-;36832:47;;36787:108;36913:19;;;;:10;:19;;;;;;36934:1;36913:22;36910:108;;;37000:2;36983:15;;36970:11;:28;;;;:::i;:::-;36969:33;;;;:::i;:::-;36955:47;;36910:108;37036:19;;;;:10;:19;;;;;;37057:1;37036:22;37033:108;;;37123:2;37106:15;;37093:11;:28;;;;:::i;:::-;37092:33;;;;:::i;:::-;37078:47;;37033:108;37159:19;;;;:10;:19;;;;;;37180:1;37159:22;37156:108;;;37246:2;37229:15;;37216:11;:28;;;;:::i;:::-;37215:33;;;;:::i;:::-;37201:47;;37156:108;37282:19;;;;:10;:19;;;;;;37303:1;37282:22;37279:108;;;37369:2;37352:15;;37339:11;:28;;;;:::i;:::-;37338:33;;;;:::i;:::-;37324:47;;37279:108;37408:19;;;;:10;:19;;;;;;37429:1;37408:22;37405:108;;;37495:2;37478:15;;37465:11;:28;;;;:::i;:::-;37464:33;;;;:::i;:::-;37450:47;;37405:108;37566:5;37539:26;29180:20;37539:11;:26;:::i;:::-;:32;;;;:::i;:::-;37521:52;;;;:::i;:::-;;36567:1043;-1:-1:-1;;;;36567:1043:0:o;39569:416::-;19408:13;:11;:13::i;:::-;39641:10:::1;::::0;-1:-1:-1;;;39641:10:0;::::1;;;:16;;39653:4;39641:16;39633:38;;;::::0;-1:-1:-1;;;39633:38:0;;10547:2:1;39633:38:0::1;::::0;::::1;10529:21:1::0;10586:2;10566:18;;;10559:30;-1:-1:-1;;;10605:18:1;;;10598:40;10655:18;;39633:38:0::1;10345:334:1::0;39633:38:0::1;39678:18;29259:42;-1:-1:-1::0;;;;;39697:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39678:44;;39737:9;39733:245;39751:10;39749:1;:12;39733:245;;;39784:12;::::0;;;:9:::1;:12;::::0;;;;;::::1;;:18;;:12:::0;:18:::1;39781:186;;;39823:19;39844:21:::0;;;:18:::1;:21;::::0;;;;;;;39884:55;;-1:-1:-1;;;39884:55:0;;-1:-1:-1;;;;;39844:21:0;;::::1;::::0;29259:42:::1;::::0;39884:24:::1;::::0;:55:::1;::::0;39917:4:::1;::::0;39844:21;;39863:1;;39884:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39803:164;39781:186;39762:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39733:245;;40508:644:::0;19408:13;:11;:13::i;:::-;40590:19:::1;29259:42;-1:-1:-1::0;;;;;40611:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40650:12;::::0;40590:46;;-1:-1:-1;;;;40650:12:0;::::1;;;:18;;40664:4;40650:18;40647:189;;;40684:9;40680:145;40698:11;40696:1;:13;40680:145;;;40748:22;::::0;-1:-1:-1;;;40748:22:0;;::::1;::::0;::::1;14605:25:1::0;;;40729:17:0::1;::::0;29259:42:::1;::::0;40748:19:::1;::::0;14578:18:1;;40748:22:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40729:41;;40785:28;40791:9;40801:11;40785:5;:28::i;:::-;-1:-1:-1::0;40710:3:0;::::1;::::0;::::1;:::i;:::-;;;;40680:145;;;;40647:189;40891:12;::::0;-1:-1:-1;;;40891:12:0;::::1;;;40888:257;;40926:9;40922:212;40941:11;40939:1;:13;40922:212;;;40975:12;::::0;;;:9:::1;:12;::::0;;;;;::::1;;:18;;:12:::0;:18:::1;40972:151;;;41035:22;::::0;-1:-1:-1;;;41035:22:0;;::::1;::::0;::::1;14605:25:1::0;;;41013:20:0::1;::::0;29259:42:::1;::::0;41035:19:::1;::::0;14578:18:1;;41035:22:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41013:44;;41076:31;41082:12;41095:11;41076:5;:31::i;:::-;40994:129;40972:151;40953:3:::0;::::1;::::0;::::1;:::i;:::-;;;;40922:212;;;;40579:573;40508:644:::0;:::o;20170:103::-;19408:13;:11;:13::i;:::-;20235:30:::1;20262:1;20235:18;:30::i;:::-;20170:103::o:0;30355:135::-;-1:-1:-1;;;;;30455:27:0;;;;;;:19;:27;;;;;;;;;30448:34;;;;;;;;;;;;;;;;;30419:16;;30448:34;;;30455:27;30448:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30355:135;;;:::o;36279:204::-;19408:13;:11;:13::i;:::-;36377:9:::1;36372:101;36392:17:::0;;::::1;36372:101;;;36451:8;36427:10;:21;36438:6;;36445:1;36438:9;;;;;;;:::i;:::-;;;;;;;36427:21;;;;;;;;;;;:32;;;;36411:3;;;;;:::i;:::-;;;;36372:101;;;;36279:204:::0;;;:::o;32801:934::-;32877:20;32919:9;32914:762;32938:8;:15;32934:1;:19;32914:762;;;32975:10;32988:8;32997:1;32988:11;;;;;;;;:::i;:::-;;;;;;;;;;;;33022:22;;;;:18;:22;;;;;;;;32988:11;;-1:-1:-1;;;;;;33022:22:0;33048:10;33022:36;33014:63;;;;-1:-1:-1;;;33014:63:0;;13552:2:1;33014:63:0;;;13534:21:1;13591:2;13571:18;;;13564:30;-1:-1:-1;;;13610:18:1;;;13603:44;13664:18;;33014:63:0;13350:338:1;33014:63:0;33094:55;;-1:-1:-1;;;33094:55:0;;29259:42;;33094:24;;:55;;33127:4;;33134:10;;33146:2;;33094:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33250:29;33276:2;33250:25;:29::i;:::-;33234:45;;;;:::i;:::-;33439:10;33419:31;;;;:19;:31;;;;;33234:45;;-1:-1:-1;33388:67:0;;33452:2;33388:30;:67::i;:::-;33503:1;33470:22;;;:18;:22;;;;;;;;:35;;-1:-1:-1;;;;;;33470:35:0;;;33521:9;:13;;;;;:19;;-1:-1:-1;;33521:19:0;;;33636:20;:24;;;;;:28;32955:3;;;;:::i;:::-;;;;32914:762;;;;33688:31;33694:10;33706:12;33688:5;:31::i;18171:164::-;18248:46;18264:7;5555:10;18287:6;18248:15;:46::i;:::-;18305:22;18311:7;18320:6;18305:5;:22::i;37735:678::-;37799:16;37836:19;;;:10;:19;;;;;;37857:1;37836:22;37833:82;;;-1:-1:-1;;37884:15:0;;;37735:678::o;37833:82::-;37933:19;;;;:10;:19;;;;;;37954:1;37933:22;37930:83;;;-1:-1:-1;;37982:15:0;;;37735:678::o;37930:83::-;38031:19;;;;:10;:19;;;;;;38052:1;38031:22;38028:82;;;-1:-1:-1;;38079:15:0;;;37735:678::o;38028:82::-;38128:19;;;;:10;:19;;;;;;38149:1;38128:22;38125:82;;;-1:-1:-1;;38176:15:0;;;37735:678::o;38125:82::-;38225:19;;;;:10;:19;;;;;;38246:1;38225:22;38222:83;;;-1:-1:-1;;38274:15:0;;;37735:678::o;38222:83::-;38326:19;;;;:10;:19;;;;;;38347:1;38326:22;38323:83;;;-1:-1:-1;;38375:15:0;;;37735:678::o;38323:83::-;37735:678;;;:::o;38972:119::-;19408:13;:11;:13::i;:::-;39053:15:::1;:30:::0;38972:119::o;6688:104::-;6744:13;6777:7;6770:14;;;;;:::i;40123:238::-;19408:13;:11;:13::i;:::-;40243:6;40222:20:::1;40260:94;40278:7;:14;40276:1;:16;40260:94;;;40309:31;40315:7;40323:1;40315:10;;;;;;;;:::i;:::-;;;;;;;40327:12;40309:5;:31::i;:::-;40293:3:::0;::::1;::::0;::::1;:::i;:::-;;;;40260:94;;11046:436:::0;11139:4;5555:10;11139:4;11222:25;5555:10;11239:7;11222:9;:25::i;:::-;11195:52;;11286:15;11266:16;:35;;11258:85;;;;-1:-1:-1;;;11258:85:0;;13895:2:1;11258:85:0;;;13877:21:1;13934:2;13914:18;;;13907:30;13973:34;13953:18;;;13946:62;-1:-1:-1;;;14024:18:1;;;14017:35;14069:19;;11258:85:0;13693:401:1;11258:85:0;11379:60;11388:5;11395:7;11423:15;11404:16;:34;11379:8;:60::i;8093:193::-;8172:4;5555:10;8228:28;5555:10;8245:2;8249:6;8228:9;:28::i;40015:85::-;19408:13;:11;:13::i;:::-;40082:10:::1;::::0;;-1:-1:-1;;;;40070:22:0;::::1;-1:-1:-1::0;;;40082:10:0;;;::::1;;;40081:11;40070:22:::0;;::::1;;::::0;;40015:85::o;33749:332::-;33822:27;;;;:18;:27;;;;;;-1:-1:-1;;;;;33822:27:0;33853:10;33822:41;33814:68;;;;-1:-1:-1;;;33814:68:0;;13552:2:1;33814:68:0;;;13534:21:1;13591:2;13571:18;;;13564:30;-1:-1:-1;;;13610:18:1;;;13603:44;13664:18;;33814:68:0;13350:338:1;33814:68:0;33960:55;33966:10;33979:34;34005:7;33979:25;:34::i;:::-;33960:5;:55::i;:::-;34026:29;;;;:20;:29;;;;;34058:15;34026:47;;33749:332::o;38843:119::-;19408:13;:11;:13::i;:::-;38924:15:::1;:30:::0;38843:119::o;39101:::-;19408:13;:11;:13::i;:::-;39182:15:::1;:30:::0;39101:119::o;8349:151::-;-1:-1:-1;;;;;8465:18:0;;;8438:7;8465:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8349:151::o;35174:289::-;35244:7;35272:27;;;:18;:27;;;;;;-1:-1:-1;;;;;35272:27:0;35264:70;;;;-1:-1:-1;;;35264:70:0;;10886:2:1;35264:70:0;;;10868:21:1;10925:2;10905:18;;;10898:30;-1:-1:-1;;;10944:18:1;;;10937:46;11000:18;;35264:70:0;10684:340:1;35264:70:0;35421:34;35447:7;35421:25;:34::i;:::-;35414:41;35174:289;-1:-1:-1;;35174:289:0:o;40387:89::-;19408:13;:11;:13::i;:::-;40449:12:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;40449:19:0::1;-1:-1:-1::0;;;;40449:19:0;;::::1;::::0;;;::::1;::::0;;40387:89::o;20428:201::-;19408:13;:11;:13::i;:::-;-1:-1:-1;;;;;20517:22:0;::::1;20509:73;;;::::0;-1:-1:-1;;;20509:73:0;;8972:2:1;20509:73:0::1;::::0;::::1;8954:21:1::0;9011:2;8991:18;;;8984:30;9050:34;9030:18;;;9023:62;-1:-1:-1;;;9101:18:1;;;9094:36;9147:19;;20509:73:0::1;8770:402:1::0;20509:73:0::1;20593:28;20612:8;20593:18;:28::i;19687:132::-:0;19595:6;;-1:-1:-1;;;;;19595:6:0;5555:10;19751:23;19743:68;;;;-1:-1:-1;;;19743:68:0;;11576:2:1;19743:68:0;;;11558:21:1;;;11595:18;;;11588:30;11654:34;11634:18;;;11627:62;11706:18;;19743:68:0;11374:356:1;14671:380:0;-1:-1:-1;;;;;14807:19:0;;14799:68;;;;-1:-1:-1;;;14799:68:0;;13147:2:1;14799:68:0;;;13129:21:1;13186:2;13166:18;;;13159:30;13225:34;13205:18;;;13198:62;-1:-1:-1;;;13276:18:1;;;13269:34;13320:19;;14799:68:0;12945:400:1;14799:68:0;-1:-1:-1;;;;;14886:21:0;;14878:68;;;;-1:-1:-1;;;14878:68:0;;9379:2:1;14878:68:0;;;9361:21:1;9418:2;9398:18;;;9391:30;9457:34;9437:18;;;9430:62;-1:-1:-1;;;9508:18:1;;;9501:32;9550:19;;14878:68:0;9177:398:1;14878:68:0;-1:-1:-1;;;;;14959:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15011:32;;14605:25:1;;;15011:32:0;;14578:18:1;15011:32:0;;;;;;;14671:380;;;:::o;12910:399::-;-1:-1:-1;;;;;12994:21:0;;12986:65;;;;-1:-1:-1;;;12986:65:0;;14301:2:1;12986:65:0;;;14283:21:1;14340:2;14320:18;;;14313:30;14379:33;14359:18;;;14352:61;14430:18;;12986:65:0;14099:355:1;12986:65:0;13142:6;13126:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13159:18:0;;:9;:18;;;;;;;;;;:28;;13181:6;;13159:9;:28;;13181:6;;13159:28;:::i;:::-;;;;-1:-1:-1;;13203:37:0;;14605:25:1;;;-1:-1:-1;;;;;13203:37:0;;;13220:1;;13203:37;;14593:2:1;14578:18;13203:37:0;;;;;;;34131:552;;34098:585::o;15342:453::-;15477:24;15504:25;15514:5;15521:7;15504:9;:25::i;:::-;15477:52;;-1:-1:-1;;15544:16:0;:37;15540:248;;15626:6;15606:16;:26;;15598:68;;;;-1:-1:-1;;;15598:68:0;;9782:2:1;15598:68:0;;;9764:21:1;9821:2;9801:18;;;9794:30;9860:31;9840:18;;;9833:59;9909:18;;15598:68:0;9580:353:1;15598:68:0;15710:51;15719:5;15726:7;15754:6;15735:16;:25;15710:8;:51::i;11952:671::-;-1:-1:-1;;;;;12083:18:0;;12075:68;;;;-1:-1:-1;;;12075:68:0;;12741:2:1;12075:68:0;;;12723:21:1;12780:2;12760:18;;;12753:30;12819:34;12799:18;;;12792:62;-1:-1:-1;;;12870:18:1;;;12863:35;12915:19;;12075:68:0;12539:401:1;12075:68:0;-1:-1:-1;;;;;12162:16:0;;12154:64;;;;-1:-1:-1;;;12154:64:0;;7475:2:1;12154:64:0;;;7457:21:1;7514:2;7494:18;;;7487:30;7553:34;7533:18;;;7526:62;-1:-1:-1;;;7604:18:1;;;7597:33;7647:19;;12154:64:0;7273:399:1;12154:64:0;-1:-1:-1;;;;;12304:15:0;;12282:19;12304:15;;;;;;;;;;;12338:21;;;;12330:72;;;;-1:-1:-1;;;12330:72:0;;10140:2:1;12330:72:0;;;10122:21:1;10179:2;10159:18;;;10152:30;10218:34;10198:18;;;10191:62;-1:-1:-1;;;10269:18:1;;;10262:36;10315:19;;12330:72:0;9938:402:1;12330:72:0;-1:-1:-1;;;;;12438:15:0;;;:9;:15;;;;;;;;;;;12456:20;;;12438:38;;12498:13;;;;;;;;:23;;12470:6;;12438:9;12498:23;;12470:6;;12498:23;:::i;:::-;;;;;;;;12554:2;-1:-1:-1;;;;;12539:26:0;12548:4;-1:-1:-1;;;;;12539:26:0;;12558:6;12539:26;;;;14605:25:1;;14593:2;14578:18;;14459:177;12539:26:0;;;;;;;;12578:37;40508:644;13642:591;-1:-1:-1;;;;;13726:21:0;;13718:67;;;;-1:-1:-1;;;13718:67:0;;12339:2:1;13718:67:0;;;12321:21:1;12378:2;12358:18;;;12351:30;12417:34;12397:18;;;12390:62;-1:-1:-1;;;12468:18:1;;;12461:31;12509:19;;13718:67:0;12137:397:1;13718:67:0;-1:-1:-1;;;;;13885:18:0;;13860:22;13885:18;;;;;;;;;;;13922:24;;;;13914:71;;;;-1:-1:-1;;;13914:71:0;;7879:2:1;13914:71:0;;;7861:21:1;7918:2;7898:18;;;7891:30;7957:34;7937:18;;;7930:62;-1:-1:-1;;;8008:18:1;;;8001:32;8050:19;;13914:71:0;7677:398:1;13914:71:0;-1:-1:-1;;;;;14021:18:0;;:9;:18;;;;;;;;;;14042:23;;;14021:44;;14087:12;:22;;14059:6;;14021:9;14087:22;;14059:6;;14087:22;:::i;:::-;;;;-1:-1:-1;;14127:37:0;;14605:25:1;;;14153:1:0;;-1:-1:-1;;;;;14127:37:0;;;;;14593:2:1;14578:18;14127:37:0;;;;;;;40922:212:::1;40579:573;40508:644:::0;:::o;20789:191::-;20882:6;;;-1:-1:-1;;;;;20899:17:0;;;-1:-1:-1;;;;;;20899:17:0;;;;;;;20932:40;;20882:6;;;20899:17;20882:6;;20932:40;;20863:16;;20932:40;20852:128;20789:191;:::o;30640:435::-;30759:12;;30742:14;30782:286;30806:6;30802:1;:10;30782:286;;;30850:7;30838:5;30844:1;30838:8;;;;;;;;:::i;:::-;;;;;;;;;:19;30834:223;;;30878:8;;;;:::i;:::-;;;;30913:6;30909:1;:10;30905:83;;;30955:5;30961:6;30955:13;;;;;;;;:::i;:::-;;;;;;;;;30944:5;30950:1;30944:8;;;;;;;;:::i;:::-;;;;;;;;;;:24;30905:83;31006:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;31036:5;;30834:223;30814:3;;;;:::i;:::-;;;;30782:286;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;:::-;250:5;14:247;-1:-1:-1;;;14:247:1:o;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:315::-;1444:6;1452;1505:2;1493:9;1484:7;1480:23;1476:32;1473:52;;;1521:1;1518;1511:12;1473:52;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;1681:2;1666:18;;;;1653:32;;-1:-1:-1;;;1376:315:1:o;1696:1047::-;1789:6;1797;1850:2;1838:9;1829:7;1825:23;1821:32;1818:52;;;1866:1;1863;1856:12;1818:52;1906:9;1893:23;1939:18;1931:6;1928:30;1925:50;;;1971:1;1968;1961:12;1925:50;1994:22;;2047:4;2039:13;;2035:27;-1:-1:-1;2025:55:1;;2076:1;2073;2066:12;2025:55;2112:2;2099:16;2134:4;2158:60;2174:43;2214:2;2174:43;:::i;:::-;2158:60;:::i;:::-;2240:3;2264:2;2259:3;2252:15;2292:2;2287:3;2283:12;2276:19;;2323:2;2319;2315:11;2371:7;2366:2;2360;2357:1;2353:10;2349:2;2345:19;2341:28;2338:41;2335:61;;;2392:1;2389;2382:12;2335:61;2414:1;2405:10;;2424:238;2438:2;2435:1;2432:9;2424:238;;;2509:3;2496:17;2526:31;2551:5;2526:31;:::i;:::-;2570:18;;2456:1;2449:9;;;;;2608:12;;;;2640;;2424:238;;;-1:-1:-1;2681:5:1;2718:18;;;;2705:32;;-1:-1:-1;;;;;;1696:1047:1:o;2748:689::-;2843:6;2851;2859;2912:2;2900:9;2891:7;2887:23;2883:32;2880:52;;;2928:1;2925;2918:12;2880:52;2968:9;2955:23;2997:18;3038:2;3030:6;3027:14;3024:34;;;3054:1;3051;3044:12;3024:34;3092:6;3081:9;3077:22;3067:32;;3137:7;3130:4;3126:2;3122:13;3118:27;3108:55;;3159:1;3156;3149:12;3108:55;3199:2;3186:16;3225:2;3217:6;3214:14;3211:34;;;3241:1;3238;3231:12;3211:34;3296:7;3289:4;3279:6;3276:1;3272:14;3268:2;3264:23;3260:34;3257:47;3254:67;;;3317:1;3314;3307:12;3254:67;3348:4;3340:13;;;;3372:6;;-1:-1:-1;3410:20:1;;;;3397:34;;2748:689;-1:-1:-1;;;;2748:689:1:o;3442:902::-;3526:6;3557:2;3600;3588:9;3579:7;3575:23;3571:32;3568:52;;;3616:1;3613;3606:12;3568:52;3656:9;3643:23;3689:18;3681:6;3678:30;3675:50;;;3721:1;3718;3711:12;3675:50;3744:22;;3797:4;3789:13;;3785:27;-1:-1:-1;3775:55:1;;3826:1;3823;3816:12;3775:55;3862:2;3849:16;3885:60;3901:43;3941:2;3901:43;:::i;3885:60::-;3967:3;3991:2;3986:3;3979:15;4019:2;4014:3;4010:12;4003:19;;4050:2;4046;4042:11;4098:7;4093:2;4087;4084:1;4080:10;4076:2;4072:19;4068:28;4065:41;4062:61;;;4119:1;4116;4109:12;4062:61;4141:1;4132:10;;4151:163;4165:2;4162:1;4159:9;4151:163;;;4222:17;;4210:30;;4183:1;4176:9;;;;;4260:12;;;;4292;;4151:163;;;-1:-1:-1;4333:5:1;3442:902;-1:-1:-1;;;;;;;3442:902:1:o;4349:273::-;4405:6;4458:2;4446:9;4437:7;4433:23;4429:32;4426:52;;;4474:1;4471;4464:12;4426:52;4513:9;4500:23;4566:5;4559:13;4552:21;4545:5;4542:32;4532:60;;4588:1;4585;4578:12;4627:180;4686:6;4739:2;4727:9;4718:7;4714:23;4710:32;4707:52;;;4755:1;4752;4745:12;4707:52;-1:-1:-1;4778:23:1;;4627:180;-1:-1:-1;4627:180:1:o;4812:184::-;4882:6;4935:2;4923:9;4914:7;4910:23;4906:32;4903:52;;;4951:1;4948;4941:12;4903:52;-1:-1:-1;4974:16:1;;4812:184;-1:-1:-1;4812:184:1:o;5001:248::-;5069:6;5077;5130:2;5118:9;5109:7;5105:23;5101:32;5098:52;;;5146:1;5143;5136:12;5098:52;-1:-1:-1;;5169:23:1;;;5239:2;5224:18;;;5211:32;;-1:-1:-1;5001:248:1:o;5462:375::-;-1:-1:-1;;;;;5720:15:1;;;5702:34;;5772:15;;;;5767:2;5752:18;;5745:43;5819:2;5804:18;;5797:34;;;;5652:2;5637:18;;5462:375::o;5842:632::-;6013:2;6065:21;;;6135:13;;6038:18;;;6157:22;;;5984:4;;6013:2;6236:15;;;;6210:2;6195:18;;;5984:4;6279:169;6293:6;6290:1;6287:13;6279:169;;;6354:13;;6342:26;;6423:15;;;;6388:12;;;;6315:1;6308:9;6279:169;;;-1:-1:-1;6465:3:1;;5842:632;-1:-1:-1;;;;;;5842:632:1:o;6671:597::-;6783:4;6812:2;6841;6830:9;6823:21;6873:6;6867:13;6916:6;6911:2;6900:9;6896:18;6889:34;6941:1;6951:140;6965:6;6962:1;6959:13;6951:140;;;7060:14;;;7056:23;;7050:30;7026:17;;;7045:2;7022:26;7015:66;6980:10;;6951:140;;;7109:6;7106:1;7103:13;7100:91;;;7179:1;7174:2;7165:6;7154:9;7150:22;7146:31;7139:42;7100:91;-1:-1:-1;7252:2:1;7231:15;-1:-1:-1;;7227:29:1;7212:45;;;;7259:2;7208:54;;6671:597;-1:-1:-1;;;6671:597:1:o;14830:275::-;14901:2;14895:9;14966:2;14947:13;;-1:-1:-1;;14943:27:1;14931:40;;15001:18;14986:34;;15022:22;;;14983:62;14980:88;;;15048:18;;:::i;:::-;15084:2;15077:22;14830:275;;-1:-1:-1;14830:275:1:o;15110:183::-;15170:4;15203:18;15195:6;15192:30;15189:56;;;15225:18;;:::i;:::-;-1:-1:-1;15270:1:1;15266:14;15282:4;15262:25;;15110:183::o;15298:128::-;15338:3;15369:1;15365:6;15362:1;15359:13;15356:39;;;15375:18;;:::i;:::-;-1:-1:-1;15411:9:1;;15298:128::o;15431:217::-;15471:1;15497;15487:132;;15541:10;15536:3;15532:20;15529:1;15522:31;15576:4;15573:1;15566:15;15604:4;15601:1;15594:15;15487:132;-1:-1:-1;15633:9:1;;15431:217::o;15653:168::-;15693:7;15759:1;15755;15751:6;15747:14;15744:1;15741:21;15736:1;15729:9;15722:17;15718:45;15715:71;;;15766:18;;:::i;:::-;-1:-1:-1;15806:9:1;;15653:168::o;15826:125::-;15866:4;15894:1;15891;15888:8;15885:34;;;15899:18;;:::i;:::-;-1:-1:-1;15936:9:1;;15826:125::o;15956:136::-;15995:3;16023:5;16013:39;;16032:18;;:::i;:::-;-1:-1:-1;;;16068:18:1;;15956:136::o;16097:380::-;16176:1;16172:12;;;;16219;;;16240:61;;16294:4;16286:6;16282:17;16272:27;;16240:61;16347:2;16339:6;16336:14;16316:18;16313:38;16310:161;;;16393:10;16388:3;16384:20;16381:1;16374:31;16428:4;16425:1;16418:15;16456:4;16453:1;16446:15;16310:161;;16097:380;;;:::o;16482:135::-;16521:3;-1:-1:-1;;16542:17:1;;16539:43;;;16562:18;;:::i;:::-;-1:-1:-1;16609:1:1;16598:13;;16482:135::o;16622:127::-;16683:10;16678:3;16674:20;16671:1;16664:31;16714:4;16711:1;16704:15;16738:4;16735:1;16728:15;16754:127;16815:10;16810:3;16806:20;16803:1;16796:31;16846:4;16843:1;16836:15;16870:4;16867:1;16860:15;16886:127;16947:10;16942:3;16938:20;16935:1;16928:31;16978:4;16975:1;16968:15;17002:4;16999:1;16992:15;17018:127;17079:10;17074:3;17070:20;17067:1;17060:31;17110:4;17107:1;17100:15;17134:4;17131:1;17124:15;17150:131;-1:-1:-1;;;;;17225:31:1;;17215:42;;17205:70;;17271:1;17268;17261:12

Swarm Source

ipfs://91bfbc9b37d8f81f49336e8bdf06b382221d3466415e96df46879d1b25aa6bce
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.